Creación y administración de programas de trabajo

Flash Player 11.4 y versiones posteriores, Adobe AIR 13.4 y versiones posteriores para plataformas de escritorio

El primer paso para utilizar un programa de trabajo para simultaneidad es crear un programa de trabajo en segundo plano. Se utilizan dos tipos de objetos para crear un programa de trabajo. El primero es una instancia de Worker, que es lo que se crea. El segundo es un objeto WorkerDomain, que crea el objeto Worker y gestiona los objetos Worker que se ejecutan en una aplicación.

Cuando se carga el motor de ejecución, crea automáticamente el objeto WorkerDomain. El motor de ejecución también crea automáticamente un programa de trabajo para el swf principal de la aplicación. Este primer programa de trabajo recibe el nombre de programa de trabajo primordial .

Dado que solo hay un objeto WorkerDomain por aplicación, se debe acceder a la instancia de WorkerDomain a través de la propiedad estática WorkerDomain.current .

En cualquier momento es posible acceder a la instancia actual de Worker (el programa de trabajo en el que se ejecuta el código) utilizando la propiedad estática Worker.current .

Creación de un objeto Worker a partir de un swf

Del mismo modo que el swf principal se ejecuta dentro del programa de trabajo primordial, un programa de trabajo en segundo plano ejecuta el código de un solo archivo swf. Para usar un programa de trabajo en segundo plano, debe crear y compilar el código del programa de trabajo como si fuera un archivo swf. Para crear el programa de trabajo en segundo plano, el programa de trabajo principal necesitará acceso a los bytes del archivo swf como un objeto ByteArray. Transfiera el objeto ByteArray al método createWorker() del objeto WorkerDomain para crear el programa de trabajo.

Se puede obtener el swf del programa de trabajo en segundo plano como un objeto ByteArray de tres formas distintas:

Incorporación del swf del programa de trabajo

Utilice la metaetiqueta [Embed] para incorporar el swf del programa de trabajo en el swf principal como un objeto ByteArray:

[Embed(source="../swfs/BgWorker.swf", mimeType="application/octet-stream")] 
private static var BgWorker_ByteClass:Class; 
private function createWorker():void 
{ 
    var workerBytes:ByteArray = new BgWorker_ByteClass(); 
    var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes); 
     
    // ... set up worker communication and start the worker 
}

El swf del programa de trabajo se compila en el swf principal como una subclase de ByteArray denominada BgWorker_ByteClass. Crear una instancia de dicha clase le proporcionará un objeto ByteArray previamente lleno con los bytes del swf del programa de trabajo.

Carga de un swf de programa de trabajo externo

Utilice un objeto URLLoader para cargar un archivo swf externo. El archivo swf debe provenir del mismo dominio de seguridad (al igual que el archivo swf cargado debe provenir del mismo dominio de Internet) que el archivo swf principal o debe estar incluido en un paquete de aplicación de AIR.

var workerLoader:URLLoader = new URLLoader(); 
workerLoader.dataFormat = URLLoaderDataFormat.BINARY; 
workerLoader.addEventListener(Event.COMPLETE, loadComplete); 
workerLoader.load(new URLRequest("BgWorker.swf")); 
 
private function loadComplete(event:Event):void 
{ 
    // create the background worker 
    var workerBytes:ByteArray = event.target.data as ByteArray; 
    var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes); 
     
    // ... set up worker communication and start the worker 
}

Cuando el objeto URLLoader termina de cargar el archivo swf, los bytes del swf están disponibles en la propiedad data del objeto URLLoader ( event.target.data en el ejemplo).

Uso del swf principal como swf del programa de trabajo

Puede utilizar un solo swf como swf principal y como swf del programa de trabajo. Utilice la propiedad loaderInfo.bytes de la clase principal de visualización para acceder a los bytes del swf.

// The primordial worker's main class constructor 
public function PrimordialWorkerClass() 
{ 
    init(); 
} 
 
private function init():void 
{ 
    var swfBytes:ByteArray = this.loaderInfo.bytes; 
     
    // Check to see if this is the primordial worker or the background worker 
    if (Worker.current.isPrimordial) 
    { 
        // create a background worker 
        var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes); 
         
        // ... set up worker communication and start the worker 
    } 
    else // entry point for the background worker 
    { 
        // set up communication between workers using getSharedProperty() 
        // ... (not shown) 
         
        // start the background work 
    } 
}

Si recurre a esta técnica, use una declaración if para dividir el código del archivo swf dentro del constructor de la clase principal o en un método al que llame. Para determinar si el código se está ejecutando en el programa de trabajo principal o en el programa de trabajo en segundo plano, compruebe la propiedad isPrimordial del objeto Worker actual, tal y como se muestra en el ejemplo.

Inicio de la ejecución de un programa de trabajo

Una vez creado un programa de trabajo, debe iniciar la ejecución del código mediante una llamada al método start() del objeto Worker. La operación de start() no se produce de forma inmediata. Para saber cuándo se está ejecutando el programa de trabajo, registre un detector para el evento workerState del objeto Worker. Este evento se distribuye cuando el objeto Worker cambia de estado en su ciclo de vida, por ejemplo, cuando inicia la ejecución del código. En el controlador de eventos workerState , compruebe que la propiedad state del objeto Worker es WorkerState.RUNNING . En dicho punto, el programa de trabajo se está ejecutando y el constructor de su clase principal se ha ejecutado. El siguiente código muestra un ejemplo del registro de un evento workerState y de una llamada al método start() :

// listen for worker state changes to know when the worker is running 
bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler); 
// set up communication between workers using 
// setSharedProperty(), createMessageChannel(), etc. 
// ... (not shown) 
bgWorker.start(); 
private function workerStateHandler(event:Event):void 
{ 
    if (bgWorker.state == WorkerState.RUNNING) 
    { 
        // The worker is running. 
        // Send it a message or wait for a response. 
    } 
}

Gestión de la ejecución del programa de trabajo

Puede acceder al conjunto de programas de trabajo en ejecución de la aplicación en cualquier momento a través del método listWorkers() de la clase WorkerDomain. Este método devuelve el conjunto de programas de trabajo cuya propiedad state es WorkerState.RUNNING , incluido el programa de trabajo primordial. Si un programa de trabajo no se ha iniciado o ya se ha detenido su ejecución, no se incluirá.

Si ya no necesita un programa de trabajo, puede llamar al método terminate() del objeto Worker para cerrar el programa de trabajo y liberar su memoria, así como otros recursos del sistema.