Workers maken en beheren

Flash Player 11.4 of hoger, Adobe AIR 13.4 of hoger voor desktopplatforms

Als u een worker voor gelijktijdige uitvoering wilt gebruiken, bestaat de eerste stap uit het maken van een worker op de achtergrond. Om een worker te maken zijn twee typen object nodig. Het eerste object is een Worker-instantie. Dit is de worker die u maakt. Het tweede is een WorkerDomain-object. Hiermee wordt de worker gemaakt en worden de Worker-objecten beheerd die in een toepassing worden uitgevoerd.

Het WorkerDomain-object wordt automatisch gemaakt tijdens het laden van de runtime. De runtime maakt ook automatisch een worker voor het SWF-hoofdbestand van de toepassing. Deze eerste worker wordt de primordial worker genoemd.

Aangezien er slechts één WorkerDomain-object voor een toepassing is, is de WorkerDomain-instantie toegankelijk via de statische eigenschap WorkerDomain.current .

De huidige Worker-instantie (de worker waarin de huidige code wordt uitgevoerd) is op elk gewenst moment toegankelijk via de statische eigenschap Worker.current .

Een Worker-object maken van een SWF-bestand

Net zoals de SWF-hoofdcode wordt uitgevoerd door de 'primordial worker', wordt de code van een enkel SWF-bestand uitgevoerd door een worker op de achtergrond. Om een worker op de achtergrond te gebruiken, moet u de code voor de worker schrijven en compileren als een SWF-bestand. Om de worker op de achtergrond te kunnen maken, moeten de bytes van het SWF-bestand als een ByteArray-object toegankelijk zijn voor de bovenliggende worker. Om de worker daadwerkelijk te kunnen maken, geeft u het ByteArray-object door aan de methode createWorker() van het WorkerDomain-object.

Er zijn drie manieren waarop de SWF-code van de worker op de achtergrond kan worden opgehaald als ByteArray-object:

Het SWF-bestand van de worker insluiten

Gebruik de [Embed]-metatag om het SWF-bestand van de worker als ByteArray-object in te sluiten in het SWF-hoofdbestand:

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

Het SWF-bestand van de worker wordt gecompileerd en opgenomen in het SWF-hoofdbestand als een ByteArray-subklasse met de naam BgWorker_ByteClass. Als u een instantie van die klasse maakt, krijgt u een ByteArray-object dat is voorgeladen met de bytes van het SWF-bestand van de worker.

Een extern SWF-bestand van de worker laden

Gebruik een URLLoader-object om een extern SWF-bestand te laden. Het SWF-bestand moet uit hetzelfde beveiligingsdomein stammen, bijvoorbeeld een SWF-bestand dat wordt geladen uit hetzelfde internetdomein als het SWF-hoofdbestand, of het SWF-bestand moet zijn opgenomen in een AIR-toepassingpakket.

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 
}

Wanneer het SWF-bestand volledig is geladen door URLLoader, zijn de bytes van het SWF-bestand beschikbaar in de eigenschap data van het URLLoader-object ( event.target.data in dit voorbeeld).

Het SWF-hoofdbestand gebruiken als het SWF-bestand van de worker

U kunt een enkel SWF-bestand zowel gebruiken als SWF-hoofdbestand en als SWF-bestand voor de worker. Via de eigenschap loaderInfo.bytes van de hoofdweergaveklasse hebt u toegang tot de bytes van het SWF-bestand.

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

Bij deze methode moet u de code van het SWF-bestand met behulp van een if -instructie aftakken binnen de constructor van de hoofdklasse of een methode die wordt aangeroepen. Om te bepalen of de code wordt uitgevoerd in de hoofdworker of in een worker op de achtergrond, kunt u de eigenschap isPrimordial van het huidige Worker-object controleren, zoals aangegeven in het voorbeeld.

De uitvoering van een worker starten

Wanneer u de worker hebt gemaakt, kunt u de bijbehorende code uitvoeren door de methode start() van het Worker-object aan te roepen. De start() -bewerking wordt niet meteen uitgevoerd. Om te controleren of de worker al dan niet wordt uitgevoerd, registreert u een listener voor de gebeurtenis workerState van het Worker-object. Die gebeurtenis wordt namelijk verzonden wanneer de status in de levenscyclus van het Worker-object verandert, bijvoorbeeld wanneer het object start met het uitvoeren van code. In uw workerState -gebeurtenishandler kunt u controleren of de eigenschap state van het Worker-object is ingesteld op WorkerState.RUNNING . In dat geval wordt de worker uitgevoerd en is ook de constructor van de bijbehorende hoofdklasse uitgevoerd. De volgende codes laten zien hoe u de registratie voor de workerState -gebeurtenis instelt en de methode start() aanroept:

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

De uitvoering van een worker beheren

De set met workers die worden uitgevoerd is op elk gewenst moment toegankelijk via de methode listWorkers() van de WorkerDomain-klasse. Deze methode retourneert de set met workers waarvan de eigenschap state is ingesteld op WorkerState.RUNNING , inclusief de 'primordial worker'. Als een worker niet is gestart of al volledig is uitgevoerd, is deze worker niet opgenomen in de set.

Als u een worker niet meer nodig hebt, kunt u de methode terminate() van het Worker-object aanroepen om de worker te sluiten en daarbij geheugenruimte en andere systeembronnen vrij te maken.