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