Skapa och hantera arbetare

Flash Player 11.4 och senare, Adobe AIR 13.4 och senare för datorplattformar

Det första steget när du vill använda en arbetare för samtidighet är att skapa en bakgrundsarbetare. Du använder två typer av objekt när du skapar en arbetare. Den första som du skapar är Worker-instansen. Den andra är ett WorkerDomain-objekt, som skapar arbetaren och administrerar hur Worker-objekten körs i ett program.

När miljön läses in skapas automatiskt WorkerDomain-objektet. I miljön skapas dessutom automatiskt en arbetare för huvud-swf-filen för programmet. Den första arbetaren kallas den primitiva arbetaren .

Eftersom det bara finns ett WorkerDomain-objekt för ett program får du åtkomst till WorkerDomain-instansen via den statiska WorkerDomain.current -egenskapen.

Du har när som helst åtkomst till den aktuella Worker-instansen (arbetaren i vilken den aktuella koden körs) via den statiska Worker.current -egenskapen.

Skapa ett Worker-objekt från en swf-fil

Precis som huvud-swf-filen körs i den primitiva arbetaren, kör bakgrundsarbetaren kod från en enskild swf-fil. Om du vill använda en bakgrundsarbetare måste du skapa och kompilera koden som en swf-fil. Om du vill skapa bakgrundsarbetaren måste den överordnade arbetaren ha åtkomst till swf-filens byte som ett ByteArray-objekt. Du skickar denna ByteArray till WorkerDomain-objektets createWorker() -metod för att de facto skapa arbetaren.

Det finns tre sätt att erhålla bakgrundsarbetarens swf-fil som ett ByteArray-objekt:

Bädda in arbetarens swf-fil

Använd metataggen [Embed] för att bädda in arbetarens swf-fil i huvud-swf-filen som en 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 
}

Arbetarens swf-fil kompileras in i huvud-swf-filen som en ByteArray-underklass med namnet BgWorker_ByteClass. Genom att skapa en instans av klassen får du en ByteArray ifylld med byte från arbetarens swf-fil.

Läsa in en externa swf-fil för arbetaren

Använd ett URLLoader-objekt för att läsa in en extern swf-fil för arbetaren. Swf-filen måste komma från samma säkerhetsdomän, till exempel som en swf-fil som läses in från samma internetdomän som huvud-swf-filen, eller ingå i ett AIR-programpaket.

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 
}

När inläsningen av swf-filen med URLLoader är klar är swf-filens byte tillgängliga i URLLoader-objektets data -egenskap ( event.target.data i detta exempel).

Använda huvud-swf-filen som swf-fil för arbetaren

Du kan använda en enskild swf-fil som både huvud-swf-fil och som swf-fil för arbetaren. Använd huvudvisningsklassens loaderInfo.bytes -egenskap för att få åtkomst till swf-filens byte.

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

Om du använder denna teknik ska du använda en if -sats för att dela upp koden för swf-filen i huvudklassens konstruktor eller i den metod som den anropar. För att kunna bestämma om koden körs i huvudarbetaren eller i bakgrundsarbetaren ska du kontrollera det aktuella Worker-objektets isPrimordial -egenskap, se exemplet nedan.

Starta körning av en arbetare

När du har skapat en arbetare startar du körningen av den genom att anropa Worker-objektets start() -metod. Åtgärden start() startar inte omedelbart. Om du vill veta när arbetaren körs ska du registrera en avlyssnare för Worker-objektets workerState -händelse. Denna händelse skickas när Worker-objektet ändrar lägen under livscykeln, till exempel när kodkörningen inleds. I händelsehanteraren workerState kontroller du att Worker-objektets state -egenskap är WorkerState.RUNNING . Du gör det när arbetaren körs och när huvudklassens konstruktor har körts. I följande kod visas ett exempel på registrering för workerState -händelsen och anropet av start() -metoden:

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

Administrera körning av arbetare

Med WorkerDomain-klassens listWorkers() -metod kan du när som helst komma åt den uppsättning arbetare som körs i programmet. Den här metoden returnerar den uppsättning arbetare vars state -egenskap är WorkerState.RUNNING , inklusive den primitiva arbetaren. Den är inte inkluderad om arbetaren inte har startats eller om körningen redan har stoppats.

Om du inte längre behöver en arbetare ska du anropa Worker-objektets terminate() -metod för att stänga arbetaren och frisläppa dess minne och andra systemresurser.