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