Erstellen und Verwalten von Workern

Flash Player 11.4 und höher, Adobe AIR 13.4 und höher für Desktopplattformen

Der erste Schritt bei der Verwendung eines Workers für die Parallelität besteht darin, einen Hintergrundworker zu erstellen. Worker lassen sich mit zwei Arten von Objekten erstellen. Das erste ist eine Worker-Instanz, die Sie erstellen. Das andere ist ein WorkerDomain-Objekt, welches den Worker erstellt und die ausgeführten Worker-Objekte in einer Anwendung verwaltet.

Wenn die Laufzeitumgebung geladen wird, erstellt sie das WorkerDomain-Objekt automatisch. Die Laufzeitumgebung erstellt auch automatisch einen Worker für die Haupt-SWF-Datei der Anwendung. Dieser erste Worker wird ursprünglicher Worker genannt.

Da es für eine Anwendung nur ein WorkerDomain-Objekt gibt, greifen Sie mit der statischen WorkerDomain.current -Eigenschaft auf die WorkerDomain-Instanz zu.

Sie können jederzeit auf die aktuelle Worker-Instanz (der Worker, in dem der aktuelle Code ausgeführt wird) zugreifen, indem Sie die statische Worker.current -Eigenschaft verwenden.

Erstellen eines Worker-Objekts aus einer SWF-Datei

So wie die Haupt-SWF-Datei innerhalb des ursprünglichen Workers ausgeführt wird, führt ein Hintergrundworker den Code einer einzelnen SWF-Datei aus. Um einen Hintergrundworker zu verwenden, müssen Sie den Code des Workers als SWF-Datei schreiben und kompilieren. Damit der Hintergrundworker erstellt werden kann, benötigt der übergeordnete Worker Zugriff auf die Bytes dieser SWF-Datei, und zwar in Form eines ByteArray-Objekts. Sie übergeben dieses ByteArray an die createWorker() -Methode des WorkerDomain-Objekts, um den Worker zu erstellen.

Es gibt im Wesentlichen drei Möglichkeiten, die SWF-Datei des Hintergrundworkers als ByteArray-Objekt zu erhalten:

Einbetten der Worker-SWF-Datei

Verwenden Sie das [Embed]-Metatag, um die Worker-SWF-Datei als ByteArray in die Haupt-SWF-Datei einzubetten:

[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 
}

Die Worker-SWF-Datei wird als ByteArray-Unterklasse mit dem Namen BgWorker_ByteClass kompiliert. Indem Sie eine Instanz dieser Klasse erstellen, erhalten Sie ein ByteArray, das mit den Bytes der Worker-SWF-Datei gefüllt ist.

Laden einer externen Worker-SWF-Datei

Verwenden Sie ein URLLoader-Objekt, um eine externe SWF-Datei zu laden. Die SWF-Datei muss aus derselben Sicherheitsdomäne stammen, zum Beispiel eine SWF-Datei, die aus derselben Internetdomäne wie die Haupt-SWF-Datei geladen wird oder die in einem AIR-Anwendungspaket enthalten ist.

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 
}

Wenn der URLLoader mit dem Laden der SWF-Datei fertig ist, sind die Bytes der SWF-Datei in der data -Eigenschaft des URLLoader-Objekts verfügbar (in diesem Beispiel event.target.data ).

Verwenden der Haupt-SWF-Datei als Worker-SWF-Datei

Sie können eine einzelne SWF-Datei sowohl als Haupt-SWF-Datei als auch als Worker-SWF-Datei verwenden. Verwenden Sie die loaderInfo.bytes -Eigenschaft der Hauptanzeigeklasse, um auf die Bytes der SWF-Datei zuzugreifen.

// 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 
    } 
}

Wenn Sie diese Technik einsetzen, verwenden Sie eine if -Anweisung, um den Code der SWF-Datei innerhalb des Konstruktors der Hauptklasse oder einer von dieser aufgerufenen Methode zu verzweigen. Um festzustellen, ob der Code im Hauptworker oder im Hintergrundworker ausgeführt wird, überprüfen Sie die isPrimordial -Eigenschaft des aktuellen Worker-Objekts wie im Beispiel gezeigt.

Starten der Ausführung eines Workers

Nachdem Sie einen Worker erstellt haben, starten Sie die Ausführung seines Codes, indem Sie die start() -Methode des Workers aufrufen. Die start() -Operation beginnt nicht sofort. Um festzustellen, wann der Worker ausgeführt wird, registrieren Sie einen Listener für das workerState -Ereignis des Worker-Objekts. Dieses Ereignis wird abgesetzt, wenn das Worker-Objekt den Zustand in seinem Lebenszyklus ändert, zum Beispiel wenn mit dem Ausführen des Codes begonnen wird. Überprüfen Sie in Ihrer workerState -Ereignisprozedur, dass die state -Eigenschaft des Worker-Objekts den Wert WorkerState.RUNNING aufweist. An diesem Punkt wird der Worker ausgeführt, und sein Hauptklassenkonstruktor wurde ausgeführt. Das folgende Codebeispiel zeigt das Registrieren eines Listeners für das workerState -Ereignis und das Aufrufen der start() -Methode:

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

Verwalten der Workerausführung

Sie können jederzeit auf die Gruppe der ausgeführten Worker in Ihrer Anwendung zugreifen, indem Sie die listWorkers() -Methode der WorkerDomain-Methode verwenden. Diese Methode gibt die Gruppe der Worker zurück, deren state -Eigenschaft den Wert WorkerState.RUNNING aufweist, dazu gehört auch der ursprüngliche Worker. Wenn ein Worker nicht gestartet oder seine Ausführung bereits beendet wurde, wird er nicht zurückgegeben.

Wenn Sie einen Worker nicht mehr benötigen, können Sie die terminate() -Methode des Worker-Objekts aufrufen, um den Worker zu schließen und seinen Speicher sowie andere Systemressourcen freizugeben.