Création et gestion de programmes de travail

Flash Player 11.4 et les versions ultérieures, Adobe AIR 13.4 et les versions ultérieures pour les plates-formes de bureau

La première étape pour utiliser un programme de travail à des fins de simultanéité est de créer un programme de travail en arrière-plan. Vous devez utiliser deux types d’objets pour créer un programme de travail. Une occurrence de l’objet Worker, que vous créez. Un objet WorkerDomain, qui crée le programme de travail et gère les objets Worker qui s’exécutent dans une application.

Lorsque le moteur d’exécution se charge, il crée l’objet WorkerDomain. Par ailleurs, le moteur d’exécution crée automatiquement un programme de travail pour le fichier swf de l’application. Ce premier programme de travail est appelé programme de travail primordial .

Etant donné qu’il n’existe qu’un seul objet WorkerDomain pour une application, vous accédez à l’occurrence de l’objet WorkerDomain à l’aide de la propriété statique WorkerDomain.current .

Vous pouvez à tout moment accéder à l’occurrence de l’objet Worker actuel (le programme de travail dans lequel le code actuel s’exécute) à l’aide de la propriété statique Worker.current .

Création d’un objet Worker à partir d’un fichier swf

Tout comme le fichier swf principal qui s’exécute au sein du programme de travail primordial, un programme de travail en arrière-plan exécute le code d’un seul fichier swf. Pour utiliser un programme de travail en arrière-plan, vous devez créer et compiler le code du programme de travail dans un fichier swf. Pour créer le programme de travail en arrière-plan, le programme de travail parent doit accéder aux octets de ce fichier swf en tant qu’objet ByteArray. Vous devez transmettre cet objet ByteArray à la méthode createWorker() de l’objet WorkerDomain pour créer le programme de travail.

Il existe trois méthodes principales pour convertir le fichier swf de programme de travail en arrière-plan en objet ByteArray :

Intégration du fichier swf de programme de travail

Utilisez la métabalise [Embed] pour intégrer le fichier swf de programme de travail dans le fichier swf principal sous forme d’objet 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 
}

Le fichier swf de programme de travail est compilé dans le fichier swf principal sous forme de sous-classe ByteArray appelée BgWorker_ByteClass. Créez une occurrence de cette classe pour obtenir un objet ByteArray prérempli avec les octets du fichier swf de programme de travail.

Chargement d’un fichier swf de programme de travail externe

Utilisez un objet URLLoader pour charger un fichier swf externe. Le fichier swf doit provenir du même domaine de sécurité ; il peut s’agir, par exemple, d’un fichier swf chargé depuis le même domaine Internet que le fichier swf principal ou inclus dans le package d’une application 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 
}

Une fois que l’objet URLLoader termine le chargement du fichier swf, les octets du fichier swf sont disponibles dans la propriété data de l’objet URLLoader ( event.target.data dans l’exemple).

Utilisation du fichier swf principal comme fichier swf de programme de travail

Vous pouvez utiliser un seul fichier swf comme fichier swf principal et fichier swf de programme de travail. Utilisez la propriété loaderInfo.bytes de la classe d’affichage principale pour accéder aux octets du fichier 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 vous utilisez cette technique, faites appel à une déclaration if pour relier le code du fichier swf au sein du constructeur de la classe principale ou d’une méthode qu’il appelle. Pour déterminer si le code s’exécute dans le programme de travail principal ou dans le programme de travail en arrière-plan, vérifiez la propriété isPrimordial de l’objet Worker actuel, comme indiqué dans l’exemple.

Lancement de l’exécution d’un programme de travail

Une fois le programme de travail créé, lancez l’exécution de son code en appelant la méthode start() de l’objet Worker. L’opération start() ne commence pas immédiatement. Pour savoir quand le programme de travail est exécuté, enregistrez un écouteur pour l’événement workerState de l’objet Worker. Cet événement est distribué lorsque l’objet Worker change d’état au cours de son cycle de vie, notamment lorsqu’il commence à exécuter le code. Dans votre gestionnaire d’événement workerState , vérifiez que la propriété state de l’objet Worker est définie sur WorkerState.RUNNING . A ce stade, le programme de travail est en cours d’exécution et le constructeur de sa classe principale s’est exécuté. Consultez la liste de code suivante pour obtenir un exemple d’enregistrement de l’événement workerState et d’appel de la méthode 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. 
    } 
}

Gestion de l’exécution du programme de travail

Vous pouvez à tout moment accéder à l’ensemble des programmes de travail en cours d’exécution dans votre application à l’aide de la méthode listWorkers() de la classe WorkerDomain. Cette méthode renvoie l’ensemble des programmes de travail dont la propriété state est définie sur WorkerState.RUNNING , y compris le programme de travail primordial. Si un programme de travail n’a pas démarré ou si son exécution a été arrêtée, il n’est pas inclus.

Si vous n’avez plus besoin d’un programme de travail, vous pouvez appeler la méthode terminate() de l’objet Worker pour arrêter le programme de travail et libérer sa mémoire, ainsi que les autres ressources du système.