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.
|
|
|