Worker (işçi) öğeleri oluşturma ve yönetme

Masaüstü platformları için Flash Player 11.4 ve sonraki sürümleri, Adobe AIR 13.4 ve sonraki sürümleri

Eş zamanlılık için worker (işçi) kullanmanın ilk adımı, bir arka plan worker (işçi) öğesi oluşturmaktır. Bir worker (işçi) oluşturmak için iki tür nesne kullanırsınız. Bunlardan ilki, oluşturduğunuz öğe olan Worker örneğidir. Diğeri ise, Worker öğesini oluşturan ve bir uygulamada çalışan Worker nesnelerini yöneten WorkerDomain nesnesidir.

Çalışma zamanı yüklendiğinde, WorkerDomain nesnesini otomatik olarak oluşturur. Çalışma zamanı ayrıca, uygulamanın ana swf'si için otomatik olarak bir worker (işçi) öğesi oluşturur. İlk worker (işçi) öğesine esas worker (işçi) adı verilir.

Bir uygulama için yalnızca bir WorkerDomain nesnesi bulunduğundan, WorkerDomain örneğine statik WorkerDomain.current özelliğini kullanarak erişebilirsiniz.

Geçerli Worker örneğine (geçerli kodun çalıştığı worker (işçi)) istediğiniz zaman statik Worker.current örneğini kullanarak erişebilirsiniz.

Bir swf'den Worker nesnesi oluşturma

Ana swf'nin esas worker (işçi) öğesiyle çalışması gibi, bir arka plan worker (işçi) öğesi de tek bir swf dosyasının kodunu yürütür. Bir arka plan worker (işçi) öğesini kullanmak için, worker (işçi) öğesinin kodunu swf dosyası olarak yazmanız ve derlemeniz gerekir. Arka plan worker (işçi) öğesi oluşturmak için, üst worker (işçi) öğesinin söz konusu swf dosyasının baytlarına ByteArray nesnesi olarak erişmesi gerekir. Worker (işçi) öğesini gerçekten oluşturmak için ByteArray nesnesini WorkerDomain nesnesinin createWorker() yöntemine iletirsiniz.

Arka plan worker (işçi) swf'sini ByteArray nesnesi olarak almanın üç ana yolu mevcuttur:

Worker (işçi) swf'sini gömme

Worker (işçi) swf'sini ana swf'nin içine ByteArray olarak gömmek için [Embed] meta etiketini kullanın:

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

Worker (işçi) swf'si ana swf'nin içine BgWorker_ByteClass adlı bir ByteArray alt sınıfı olarak derlenir. Bu sınıfın bir örneğinin oluşturulması size, worker (işçi) swf'sinin baytlarıyla önceden doldurulmuş bir ByteArray sağlar.

Harici bir worker (işçi) swf'si yükleme

Harici bir swf dosyasını yüklemek için bir URLLoader nesnesi kullanın. Söz konusu swf dosyası, ana swf ile aynı internet etki alanından yüklenmiş veya bir AIR uygulama paketine dahil edilmiş bir swf dosyası gibi aynı güvenlik etki alanından gelmelidir.

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 
}

URLLoader, swf dosyasını yüklemeyi tamamladığında, swf'nin baytları URLLoader nesnesinin data özelliğinde (örnekte event.target.data ) kullanılabilir hale gelir.

Ana swf'yi worker (işçi) swf'si olarak kullanma

Tek bir swf'yi hem ana swf hem de worker (işçi) swf'si olarak kullanabilirsiniz. Ana görüntüleme sınıfının loaderInfo.bytes özelliğini, swf'nin baytlarına erişmek için kullanın.

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

Bu tekniği kullanıyorsanız, ana sınıfın oluşturucusu veya çağırdığı bir yöntem içindeki swf dosya kodunu kollara ayırmak için bir if ifadesi kullanın. Kodun ana worker (işçi) öğesinde mi, yoksa arka plan worker (işçi) öğesinde mi çalıştığını belirlemek için, örnekte gösterildiği şekilde, geçerli Worker nesnesinin isPrimordial özelliğini denetleyin.

Worker (işçi) öğesinin yürütülmesini başlatma

Bir worker (işçi) oluşturduktan sonra, bu worker (işçi) öğesinin kod yürütme işlemini, Worker nesnesinin start() yöntemini çağırarak başlatırsınız. start() işlemi hemen gerçekleştirilmez. Worker (işçi) çalıştırıldığında haberdar olmak için, Worker nesnesinin workerState olayı için bir dinleyici kaydedin. Bu olay, Worker nesnesi yaşam döngüsünde durumunu değiştirdiğinde; örneğin kod yürütmeye başladığında gönderilir. workerState olay işleyicinizde, Worker nesnesinin state özelliğinin WorkerState.RUNNING olup olmadığını denetleyin. Bu noktada, worker (işçi) çalışır durumdadır ve ana sınıfının oluşturucusu çalıştırılmıştır. Aşağıdaki kod listesi, workerState olayını kaydetmeye ve start() yöntemini çağırmaya yönelik bir örneği göstermektedir:

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

Worker (işçi) yürütmeyi yönetme

WorkerDomain sınıfının listWorkers() yöntemini kullanarak, istediğiniz zaman uygulamanızda çalışan worker (işçi) kümesine erişebilirsiniz. Bu yöntem, esas worker (işçi) öğesi de dahil olmak üzere, state özelliği WorkerState.RUNNING olan worker (işçi) kümesini döndürür. Bir worker (işçi) başlatılmamışsa veya yürütülmesi durdurulmuşsa, bu worker (işçi) dahil edilmez.

Bir worker (işçi) öğesine artık gereksinim duymuyorsanız, Worker nesnesinin terminate() yöntemini worker (işçi) öğesini kapatması ve belleği ile diğer sistem kaynaklarını boşaltması için çağırabilirsiniz.