Paket | flash.system |
Sınıf | public final class Worker |
Miras Alma | Worker EventDispatcher Object |
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Worker (işçi), başka bir worker (işçi) öğesinde (ana swf'nin worker (işçi) öğesi de dahil) diğer işlemler çalışırken aynı anda "arka planda" kod yürütmenize olanak sağlar. Worker (işçi) dışı bağlamda bazı işlemlerin (örneğin, bir döngüde büyük bir veri kümesinin işlenmesi) yürütülmesi uzun sürdüğünden, ana uygulama iş parçacığının ekranı yeterince hızlı güncellemesi önlenir. Bu, ekranın titremesine veya donmasına neden olabilir.
Worker (işçi) kullanmanız, uzun süre çalışan veya yavaş bir işlemi arka planda gerçekleştirmenize olanak sağlar. Her worker (işçi), kendi kodunu diğer worker (işçi) öğelerinden ayrı bir yürütme iş parçacığında çalıştırır. Bir worker (işçi) öğesindeki uzun süre çalışan kod, başka bir worker (işçi) öğesindeki kodun yürütmesini önlemez. Bunun yerine, iki kod kümesi paralel olarak çalışır. Sonuç olarak ana uygulama iş parçacığı ekranı güncellemeye devam ederken, arka planda kod yürütmek için bir worker (işçi) kullanılabilir.
Aynı anda birden çok kod kümesini yürütme yeteneği, eşzamanlılık olarak bilinir.
Not: Eşzamanlılık için worker (işçi) öğelerinin kullanılması masaüstü platformlarda hem Flash Player'da hem de AIR'de desteklenir. Mobil platformlarda eşzamanlılık hem Android hem de iOS üzerindeki AIR'de desteklenir. Kullanmayı denemeden önce eşzamanlılığın desteklenip desteklenmediğini kontrol etmek için, statik isSupported özelliğini kullanabilirsiniz.
Worker()
yapıcısını çağırarak doğrudan Worker örnekleri oluşturmazsınız. Eşzamanlılık için worker (işçi) öğelerinin kullanımının desteklendiği bağlamlarda, başlangıçta çalışma zamanı, ilkel worker olarak bilinen, ana SWF ile ilişkili Worker (İşçi) öğesini otomatik olarak oluşturur.
Her ek worker (işçi), ayrı bir swf'den oluşturulur. Yeni bir Worker sınıfı örneği oluşturmak için, arka plan worker (işçi) öğesinin swf baytlarını içeren bir ByteArray öğesini WorkerDomain sınıfının createWorker()
yöntemine argüman olarak iletin. Bu amaçla bir swf'nin baytlarına erişmenin üç yaygın yolu vardır:
-
.swf dosyasını bir ByteArray olarak uygulamaya gömmek için [Embed] meta etiketini kullanın:
// Embed the SWF file [Embed(source="../swfs/BgWorker.swf", mimeType="application/octet-stream")] private static var BgWorker_ByteClass:Class; private function createWorker():void { // create the background worker var workerBytes:ByteArray = new BgWorker_ByteClass(); var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes); // 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(); }
-
Bir URLLoader kullanarak harici bir SWF dosyası yükleyin:
// load the SWF file 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); // 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(); }
-
İlkel worker (işçi) ve arka plan worker (işçi) olarak tek bir swf 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 if (Worker.current.isPrimordial) { // create a background worker var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes); // 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(); } else // entry point for the background worker { // set up communication between workers using getSharedProperty() // ... (not shown) // start the background work } }
Worker (işçi) öğeleri birbirinden ayrı yürütülür ve aynı belleğe, değişkenlere ve koda erişim elde etmez. Ancak Worker (işçi) örnekleri arasında mesaj ve verileri iletmek için kullanılabilir üç mekanizma vardır:
- Paylaşılan özellikler: Her worker (işçi), kendisinden ve diğer worker (işçi) öğelerinden ayarlanabilen ve okunabilen dahili bir adlandırılmış değerler kümesine sahiptir.
setSharedProperty()
yöntemini kullanarak bir değer ayarlayabilir vegetSharedProperty()
yöntemini kullanarak bir değer okuyabilirsiniz. - MessageChannel: Bir MessageChannel nesnesi, bir worker (işçi) öğesinden diğerine tek yönlü mesajlar ve veriler göndermenize olanak sağlar. Alıcı worker (işçi) öğesindeki kod, bir mesaj geldiğinde bildirim almak için bir olayı dinleyebilir. MessageChannel nesnesi oluşturmak için
createMessageChannel()
yöntemini kullanın. - Paylaşılabilir ByteArray: Bir ByteArray nesnesinin
shareable
özelliğitrue
ise, temel belleğin aynısı söz konusu ByteArray örnekleri için tüm worker (işçi) öğelerinde kullanılır. Birden fazla worker (işçi) öğesindeki kod paylaşılan belleğe aynı anda erişebildiğinden, kodunuzun, beklenmeyen veri değişiklikleri sonucu oluşan sorunları önleme amacıylaByteArray.shareable
özelliği açıklamasında belirtilen mekanizmaları kullanması gerekir.
Birçok çalışma zamanı API'si, arka plan worker (işçi) öğesinde çalışan kodda kullanılamaz. Bu öncelikle, kullanıcı girdi ve çıktı mekanizmalarıyla ilgili API'lerden veya pencereler ve sürükleme gibi işletim sistemi öğelerinden oluşur. Kural olarak, tüm bağlamlarda desteklenmeyen herhangi bir API için isSupported
, available
ve benzeri özellikleri kullanarak, API'yi kullanmaya çalışmadan önce arka plan worker (işçi) bağlamında API'nin kullanılabilir olup olmadığını kontrol edin.
Not: Arka plan ve ikincil işçiler için Yerel Uzantılar desteklenmez.
Worker nesneleri, ana görüntü oluşturma iş parçacığının diğer kod tarafından engellenmesi nedeniyle kare hızı düşüş olasılığını azalttığı için kullanışlıdır. Ancak worker nesneleri ek sistem belleği ve CPU kullanımı gerektirir ve bu da genel uygulama performansı açısından maliyetli olabilir. Her worker (işçi) kendi çalışma zamanı sanal makine örneğini kullandığından, ufak bir worker (işçi) öğesinin bile ek yükü büyük olabilir. Worker (işçi) öğelerini kullanırken, sistemdeki taleplerin çok büyük olmadığından emin olmak için tüm hedef platformlarınızda kodunuzu test edin. Adobe, tipik bir senaryoda bir veya ikiden fazla arka plan worker (işçi) kullanmamanızı önerir.
Daha fazla bilgi
Intro to AS3 Workers: Image Processing (AS3 Worker (İşçi) Öğelerine Giriş: Görüntü İşleme), Shawn Blais
Multithreaded Physics: Using AS3 Workers for a physics engine (Çok İş Parçacıklı Fizik: Fizik motoru için AS3 Worker (İşçi) öğelerini kullanma), Shawn Blais
İlgili API Öğeleri
Özellik | Tanımlayan: | ||
---|---|---|---|
constructor : Object
Belirli bir nesne örneği için sınıf nesnesine veya yapıcı işlevine bir başvuru. | Object | ||
current : Worker [statik] [salt okunur]
Geçerli kodu içeren worker (işçi) öğesine erişim sağlar
| Worker | ||
isPrimordial : Boolean [salt okunur]
Bu worker (işçi) öğesinin ilkel bir worker (işçi) olup olmadığını belirtir. | Worker | ||
isSupported : Boolean [statik] [salt okunur]
Geçerli çalışma zamanı bağlamının eşzamanlı kod yürütme için Worker nesnelerinin kullanımını destekleyip desteklemediğini belirtir. | Worker | ||
state : String [salt okunur]
Worker (işçi) öğesinin yaşam döngüsündeki geçerli durumu. | Worker |
Yöntem | Tanımlayan: | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void [geçersiz kıl]
EventDispatcher nesnesi olan bir olay dinleyici nesnesini, dinleyicinin bir olayın bildirimini alması için kaydeder. | Worker | ||
Yöntemin başka bir alıcı worker (işçi) öğesine çağrıldığı worker (işçi) öğesinden mesaj göndermek için yeni bir MessageChannel örneği oluşturur. | Worker | ||
Olay akışına bir olay gönderir. | EventDispatcher | ||
Adlandırılmış bir anahtar ile bu worker (işçi) öğesinde saklanan bir değeri alır. | Worker | ||
EventDispatcher nesnesinin belirli bir olay türü için kayıtlı dinleyicisi olup olmadığını kontrol eder. | EventDispatcher | ||
Bir nesnenin belirli bir özelliğinin tanımlı olup olmadığını gösterir. | Object | ||
Object sınıfının bir örneğinin parametre olarak belirtilen nesnenin prototip zincirinde olup olmadığını gösterir. | Object | ||
Belirtilen özelliğin bulunup bulunmadığını ve numaralandırılabilir olup olmadığını gösterir. | Object | ||
[geçersiz kıl]
EventDispatcher nesnesinden bir dinleyiciyi kaldırır. | Worker | ||
Dinamik bir özelliğin döngü işlemlerinde kullanılabilirliğini ayarlar. | Object | ||
Worker (işçi) öğesinin swf dosyasında çalışan kod için kullanılabilir olan adlandırılmış bir değer sağlar. | Worker | ||
Worker (işçi) öğesinin yürütülmesini başlatır. | Worker | ||
Bu worker (işçi) öğesinin kodunun yürütmesini durdurur. | Worker | ||
Bu nesnenin, yerel ayara özel kurallara göre biçimlendirilmiş dize temsilini döndürür. | Object | ||
Belirtilen nesnenin dize olarak temsil edilen halini döndürür. | Object | ||
Belirtilen nesnenin temel değerini döndürür. | Object | ||
Bir olay dinleyicisinin bu EventDispatcher nesnesiyle mi, yoksa onun belirtilen olay türüne yönelik üst öğelerinden biriyle mi kayıtlı olduğunu kontrol eder. | EventDispatcher |
Olay | Özet | Tanımlayan: | ||
---|---|---|---|---|
[broadcast olayı] Flash Player veya AIR uygulaması işletim sistemi odağına gelip etkin olduğunda gönderilir. | EventDispatcher | |||
[broadcast olayı] Çalışan Flash Player veya AIR uygulaması sistem odağını kaybettiğinde ve etkin olmayan duruma geldiğinde gönderilir. | EventDispatcher | |||
Worker (işçi) öğesinin state özelliğinin değeri değiştiğinde gönderilir. | Worker |
current | özellik |
isPrimordial | özellik |
isPrimordial:Boolean
[salt okunur] Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Bu worker (işçi) öğesinin ilkel bir worker (işçi) olup olmadığını belirtir.
İlkel worker (işçi), ilk swf'nin çalıştığı worker (işçi) öğesidir. Bu worker (işçi), ekranda görüntü oluşturmayı kontrol eder.
Bu özellik, ilkel worker (işçi) ve arka plan worker (işçi) öğesinin aynı swf dosyasının iki örneği olduğu bir uygulamayı tasarlamak için kullanılabilir. Alternatif olarak, arka plan worker (işçi) öğesinin, ilkel worker (işçi) öğesinden farklı bir swf dosyasına derlenmiş farklı bir kod kullanması için kodunuzu yapılandırabilirsiniz.
Uygulama
public function get isPrimordial():Boolean
isSupported | özellik |
isSupported:Boolean
[salt okunur] Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Geçerli çalışma zamanı bağlamının eşzamanlı kod yürütme için Worker nesnelerinin kullanımını destekleyip desteklemediğini belirtir.
Eşzamanlılık kullanılabiliyorsa, bu özelliğin değeri true
olur.
Uygulama
public static function get isSupported():Boolean
state | özellik |
addEventListener | () | yöntem |
override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
EventDispatcher nesnesi olan bir olay dinleyici nesnesini, dinleyicinin bir olayın bildirimini alması için kaydeder. Belirli türde bir olay, aşama ve öncelik için görüntüleme listesindeki tüm düğümlere olay dinleyicilerini kaydedebilirsiniz.
Bir olay dinleyicisini başarıyla kaydettikten sonra, addEventListener()
öğesine ek çağrılar yaparak önceliğini değiştiremezsiniz. Bir dinleyicinin önceliğini değiştirmek için, ilk olarak removeListener()
öğesini çağırmanız gerekir. Daha sonra dinleyiciyi yeni öncelik seviyesiyle kaydedebilirsiniz.
Dinleyici kaydedildikten sonra, farklı bir type
veya useCapture
değeriyle addEventListener()
öğesine yapılan çağrılar, ayrı bir dinleyici kaydının oluşturulmasıyla sonuçlanır. Örneğin, ilk olarak useCapture
true
değerine ayarlanmış durumdayken bir dinleyiciyi kaydederseniz, dinleyici yalnızca yakalama aşaması boyunca dinleme işlemi yapar. Aynı dinleyici nesnesini kullanarak, ancak useCapture
false
değerine ayarlanmış durumdayken tekrar addEventListener()
öğesini çağırırsanız, iki ayrı dinleyiciniz olur: bunlardan biri yakalama aşamasında dinleme işlemi yapar, diğeri ise hedef ve köpürme aşamasında dinleme işlemi yapar.
Yalnızca hedef aşaması veya köpürme aşaması için bir olay dinleyicisini kaydedemezsiniz. Köpürme yalnızca hedef düğümün alt öğeleri için geçerli olduğundan, bu aşamalar kayıt sırasında birleştirilir.
Artık bir olay dinleyicisine ihtiyacınız olmadığında, removeEventListener()
öğesini çağırarak olay dinleyicisini kaldırın, aksi takdirde bellek sorunları oluşabilir. Çöp toplayıcısı, gönderen nesne var olduğu sürece dinleyiciyi kaldırmadığından, (useWeakReference
parametresi true
olarak ayarlı değilse) olay dinleyicileri otomatik olarak bellekten kaldırılmaz.
Bir EventDispatcher örneği kopyalandığında, o örneğe ekli olan olay dinleyicileri kopyalanmaz. (Yeni oluşturulmuş düğümünüz için bir olay dinleyicisi gerekiyorsa, düğümü oluşturduktan sonra dinleyiciyi eklemeniz gerekir.) Ancak bir EventDispatcher örneğini taşırsanız, örneğe ekli olan olay dinleyicileri de onunla birlikte taşınır.
Bir olay düğümde işlenirken olay dinleyicisi o düğüme kaydediliyorsa, geçerli aşama sırasında olay dinleyicisi tetiklenmez ancak olay akışındaki köpürme aşaması gibi sonraki bir aşamada tetiklenebilir.
Bir olay düğümde işlenirken olay dinleyicisi o düğümden kaldırılırsa, geçerli eylemler tetiklenmeye devam eder. Olay dinleyicisi kaldırıldıktan sonra asla tekrar çağrılmaz (ileride işlenmek üzere tekrar kaydedilmediği sürece).
Parametreler
type:String — Olay türü.
| |
listener:Function — Olayı işleyen dinleyici işlevi. Bu işlev, bu örnekte gösterildiği gibi, Event nesnesini tek parametresi olarak kabul etmeli ve hiçbir öğe döndürmemelidir:
function(evt:Event):void İşleve herhangi bir ad verilebilir. | |
useCapture:Boolean (default = false ) —
Dinleyicinin yakalama aşamasında mı, yoksa hedef ve köpürme aşamalarında mı çalıştığını belirler. useCapture , true olarak ayarlanırsa dinleyici, olayı hedef veya köpürme aşamasında değil de yalnızca yakalama aşamasında işler. useCapture false değerindeyse dinleyici, olayı yalnızca hedef veya köpürme aşamasında işler. Olayı üç aşamada da dinlemek için addEventListener öğesini iki kez, biri useCapture true değerine ayarlanmış olarak, diğeri de useCapture false değerine ayarlanmış olarak çağırın.
| |
priority:int (default = 0 ) — Olay dinleyicisinin öncelik düzeyi. Öncelik, işaretli 32 bit tam sayı tarafından atanır. Sayı ne kadar yüksekse, öncelik de o kadar yüksek olur. n önceliğine sahip tüm dinleyiciler, n-1 önceliğine sahip dinleyicilerden önce işlenir. İki veya daha fazla dinleyici aynı önceliği paylaşırsa, eklendikleri sıraya göre işlenirler. Varsayılan öncelik 0'dır.
| |
useWeakReference:Boolean (default = false ) — Dinleyici başvurusunun güçlü mü, yoksa zayıf mı olduğunu belirler. Güçlü bir başvuru (varsayılan), dinleyicinizin çöp toplama işlemine tabi tutulmasını önler. Zayıf bir başvuru, bu işlevi yapmaz. Sınıf düzeyi üye işlevleri, çöp toplama işlemine tabi değildir. Böylece onları çöp toplama işlemine tabi tutmadan, sınıf düzeyi üye işlevleri için |
createMessageChannel | () | yöntem |
public function createMessageChannel(receiver:Worker):MessageChannel
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Yöntemin başka bir alıcı worker (işçi) öğesine çağrıldığı worker (işçi) öğesinden mesaj göndermek için yeni bir MessageChannel örneği oluşturur. MessageChannel nesnesini oluşturan worker (işçi) öğesindeki kod, receiver
argümanı olarak belirtilen Worker nesnesine tek yönlü mesajlar göndermek için bunu kullanabilir.
MessageChannel örneği, bir Worker örneğinden diğerine mesaj ve veri göndermek için kullanılabilse de, en az bir MessageChannel örneğinin, Worker nesnesinin setSharedProperty()
yöntemi çağrılarak paylaşılan bir özellik olarak alt Worker (İşçi) öğesine iletilmesi gerekir.
outgoingChannel = Worker.current.createMessageChannel(bgWorker); incomingChannel = bgWorker.createMessageChannel(Worker.current); bgWorker.setSharedProperty("incoming", outgoingChannel); bgWorker.setSharedProperty("outgoing", incomingChannel); // listen for messages from the receiving MessageChannel // This event is triggered when the background sends a message to this worker incomingChannel.addEventListener(Event.CHANNEL_MESSAGE, incomingMessageHandler);
Parametreler
receiver:Worker — Oluşturulan mesaj kanalı aracılığıyla iletilen mesajları alacak worker (işçi)
|
MessageChannel — İşlem tarafından oluşturulan MessageChannel nesnesi
|
getSharedProperty | () | yöntem |
public function getSharedProperty(key:String):*
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Adlandırılmış bir anahtar ile bu worker (işçi) öğesinde saklanan bir değeri alır.
Alt worker (işçi) öğesindeki kod, worker (işçi) swf dosyasının ana sınıfının yapıcısındaki kadar erken bir değer almak için bu yöntemi çağırabilir.
Parametreler
key:String — Alınacak paylaşılan özelliğin adı
|
* — Belirtilen anahtar ile saklanan paylaşılan özellik değeri veya belirtilen anahtar için saklanan bir değer yoksa null
|
removeEventListener | () | yöntem |
override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
EventDispatcher nesnesinden bir dinleyiciyi kaldırır. EventDispatcher nesnesiyle kayıtlı eşlenen bir dinleyici yoksa, bu yönteme yapılan çağrının herhangi bir etkisi yoktur.
Parametreler
type:String — Olay türü.
| |
listener:Function — Kaldırılacak dinleyici nesnesi.
| |
useCapture:Boolean (default = false ) —
Dinleyicinin yakalama aşaması için mi yoksa hedef ve köpürme aşamaları için mi kaydedildiğini belirtir. Dinleyici, hem yakalama aşaması hem de hedef ve köpürme aşamaları için kaydedildiyse, removeEventListener() öğesine yapılan iki çağrı, ikisini de kaldırmak için gereklidir. useCapture() öğesine sahip çağrılardan biri true , useCapture() öğesine sahip olan diğeri ise false olarak ayarlanmıştır.
|
setSharedProperty | () | yöntem |
public function setSharedProperty(key:String, value:*):void
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Worker (işçi) öğesinin swf dosyasında çalışan kod için kullanılabilir olan adlandırılmış bir değer sağlar.
Worker (işçi) öğesinin start()
yöntemini çağırmadan önce bu yöntemi çağırabilirsiniz. Bu durumda paylaşılan özellik, yapı anında worker (işçi) öğesinin swf dosyasındaki kod için kullanılabilir olur.
value
parametresine iletilen değer neredeyse herhangi bir nesne olabilir. Aşağıda belirtilen istisnalar dışında, value
parametresine iletilen herhangi bir nesne, referans tarafından iletilmez. setSharedProperty()
çağrıldıktan sonra bir worker (işçi) öğesindeki nesneye yapılan herhangi bir değişiklik, diğer worker (işçi) öğesine taşınmaz. Nesne AMF3 biçimine serileştirilerek ve alıcı worker (işçi) öğesindeki yeni bir nesneye serileştirilmesi kaldırılarak kopyalanır. Bu nedenle, görüntüleme nesneleri de dahil olmak üzere, AMF3 biçiminde serileştirilemeyen herhangi bir nesne, value
parametresine iletilemez. Özel sınıfın düzgün şekilde iletilmesi için, flash.net.registerClassAlias()
işlevi veya [RemoteClass]
meta verisi kullanılarak sınıf tanımının kaydedilmesi gerekir. Bu tekniklerden herhangi biriyle, her iki worker (işçi) öğesinin sınıf sürümü için aynı diğer ad kullanılmalıdır.
Bu kural için, nesnelerin worker (işçi) öğeleri arasında paylaşılmadığı istisna niteliğinde beş tür nesne vardır:
- Worker
- MessageChannel
- paylaşılabilir ByteArray (
shareable
özelliğitrue
olarak ayarlanmış bir ByteArray nesnesi - Mutex
- Durum
Bu nesnelerin bir örneğini value
parametresine iletirseniz, her worker (işçi) öğesinin aynı temel nesneye bir referansı vardır. Bir worker (işçi) öğesindeki örnek üzerinde yapılan değişiklikler, diğer worker (işçi) öğelerinde hemen kullanılabilir olur. Ayrıca, setSharedProperty()
yöntemini kullanarak bu nesnelerin aynı örneğini birden çok defa iletirseniz çalışma zamanı, alıcı worker (işçi) öğesinde nesnenin yeni bir kopyasını oluşturmaz. Bunun yerine, aynı referans yeniden kullanılır ve böylece sistem belleği kullanımı azaltılır.
value
argümanı için null
veya undefined
ile bu yöntem çağrıldığında, belirtilen key
argümanı için önceden ayarlanan herhangi bir değer temizlenir. Bir değer bu şekilde temizlendiğinde, değerin referansı kaldırılır ve böylece çöp toplanmasına olanak sağlanır.
Key argümanında herhangi bir String değeri kullanabilirsiniz. Bu paylaşılan özellikler, bir worker (işçi) öğesine erişimi olan herhangi bir kod için kullanılabilir. Yanlışlıkla bir değerin üzerine yazılmasını önlemek istiyorsanız, tuş adlarınızı benzersiz yapmaya çalışmak için benzer mekanizma, önek veya sonek kullanmayı deneyin.
Parametreler
key:String — Paylaşılan özelliğin saklandığı ad.
| |
value:* — Paylaşılan özelliğin değeri.
|
İlgili API Öğeleri
start | () | yöntem |
public function start():void
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Worker (işçi) öğesinin yürütülmesini başlatır. Çalışma zamanı, worker (işçi) iş parçacığını oluşturur ve worker (işçi) swf'sinin ana sınıfının yapıcısını çağırır.
Bu işlem senkronize değildir. Worker (işçi) başlangıcı tamamlandıktan sonra, state
özelliğini WorkerState.RUNNING
olarak değiştirir ve bir workerState
olayı gönderir.
terminate | () | yöntem |
public function terminate():Boolean
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Bu worker (işçi) öğesinin kodunun yürütmesini durdurur. Bu yöntem çağrıldığında, worker (işçi) öğesinin swf dosyasındaki geçerli ActionScript durdurulur.
DöndürürBoolean — Worker (işçi) öğesindeki kod çalışıyorsa ve kesintiye uğradıysa true veya worker (işçi) öğesi hiç başlatılmadıysa false
|
workerState | Olay |
flash.events.Event
özellik Event.type =
flash.events.Event.WORKER_STATE
Dil Sürümü: | ActionScript 3.0 |
Çalışma Zamanı Sürümleri: | Flash Player 11.4, AIR 3.4 |
Worker (işçi) öğesinin state
özelliğinin değeri değiştiğinde gönderilir.
Event.WORKER_STATE
sabiti, workerState
olay nesnesinin type
özelliğinin değerini tanımlar.
Bu olay şu özelliklere sahiptir:
Özellik | Değer |
---|---|
bubbles | false |
cancelable | false ; iptal edilecek varsayılan davranış yoktur. |
currentTarget | Bu Event nesnesini olay dinleyicisiyle etkin olarak işleyen nesne. |
target | Bu olayı gönderen nesne. |
Bu örnek üç ActionScript sınıfından oluşur: WorkerExample ana sınıf ve üst worker (işçi) öğesidir. BackgroundWorker, arka plan işini yapan sınıftır. Bu, arka plan worker (işçi) swf'nin ana sınıfı olarak derlenmiştir. CountResult, iki worker (işçi) arasında birden çok değer yerine tek bir nesne olarak verileri iletmek için kullanılan özel bir sınıftır.
Bu örnekte arka plan worker (işçi), üst worker (işçi) tarafından belirtilen bir sayıya kadar döngüde sayılır. İşinde ilerledikçe, üst worker (işçi) öğesine ilerleme mesajları gönderir. Sonuç olarak sayım bittiğinde arka plan worker (işçi), üst worker (işçi) öğesine bir mesaj göndererek sayımın bittiğini ve ne kadar sürdüğünü bildirir.
WorkerExample sınıfı, swf'nin ana sınıfı, bu nedenle ilkel worker (işçi) öğesinin ana sınıfıdır. initialize()
yönteminde kod, [Embed]
etiketi kullanılarak gömülen BackgroundWorker sınıfının baytlarını kullanarak arka plan worker (işçi) nesnesini oluşturur.
WorkerDomain.createWorker()
çağrılarak arka plan worker (işçi) öğesi oluşturulduktan sonra kod, worker (işçi) öğeleri arasında iletişim kurar. Önce kod bir MessageChannel nesneleri kümesi oluşturur. setSharedProperty()
yöntemini çağırarak bunları arka plan worker (işçi) öğesine iletir. Son olarak arka plan Worker nesnesinin workerState
olayına kaydolur ve start()
yöntemini çağırarak worker (işçi) öğesini başlatır.
Arka plan worker (işçi) öğesi işini yaptıkça, üst worker (işçi) öğesine ilerleme mesajları (ve en sonunda sonucu) gönderir. Üst worker (işçi) öğesi, ilerleme çubuğunu ve metin göstergesini güncellemek için bu bilgileri kullanır.
package { import com.adobe.example.vo.CountResult; import flash.display.Shape; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.net.registerClassAlias; import flash.system.MessageChannel; import flash.system.Worker; import flash.system.WorkerDomain; import flash.system.WorkerState; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFormatAlign; import flash.utils.ByteArray; public class WorkerExample extends Sprite { // ------- Embed the background worker swf as a ByteArray ------- [Embed(source="../workerswfs/BackgroundWorker.swf", mimeType="application/octet-stream")] private static var BackgroundWorker_ByteClass:Class; public static function get BackgroundWorker():ByteArray { return new BackgroundWorker_ByteClass(); } private var bgWorker:Worker; private var bgWorkerCommandChannel:MessageChannel; private var progressChannel:MessageChannel; private var resultChannel:MessageChannel; public function WorkerExample() { initialize(); } private function initialize():void { // create the user interface setupStage(); createStatusText(); createProgressBar(); // Register the alias so we can pass CountResult objects between workers registerClassAlias("com.adobe.test.vo.CountResult", CountResult); // Create the background worker bgWorker = WorkerDomain.current.createWorker(BackgroundWorker); // Set up the MessageChannels for communication between workers bgWorkerCommandChannel = Worker.current.createMessageChannel(bgWorker); bgWorker.setSharedProperty("incomingCommandChannel", bgWorkerCommandChannel); progressChannel = bgWorker.createMessageChannel(Worker.current); progressChannel.addEventListener(Event.CHANNEL_MESSAGE, handleProgressMessage) bgWorker.setSharedProperty("progressChannel", progressChannel); resultChannel = bgWorker.createMessageChannel(Worker.current); resultChannel.addEventListener(Event.CHANNEL_MESSAGE, handleResultMessage); bgWorker.setSharedProperty("resultChannel", resultChannel); // Start the worker bgWorker.addEventListener(Event.WORKER_STATE, handleBGWorkerStateChange); bgWorker.start(); } private function handleBGWorkerStateChange(event:Event):void { if (bgWorker.state == WorkerState.RUNNING) { _statusText.text = "Background worker started"; bgWorkerCommandChannel.send(["startCount", 100000000]); } } private function handleProgressMessage(event:Event):void { var percentComplete:Number = progressChannel.receive(); setPercentComplete(percentComplete); _statusText.text = Math.round(percentComplete).toString() + "% complete"; } private function handleResultMessage(event:Event):void { var result:CountResult = resultChannel.receive() as CountResult; setPercentComplete(100); _statusText.text = "Counted to " + result.countTarget + " in " + (Math.round(result.countDurationSeconds * 10) / 10) + " seconds"; } // ------- Create UI ------- private var _currentPercentComplete:int = 0; private var _needsValidation:Boolean = false; private var _statusText:TextField; private var _progressBarRect:Shape; private var _progressBar:Shape; private function setupStage():void { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.stageWidth = 800; stage.stageHeight = 600; stage.color = 0xffffff; } private function createStatusText():void { _statusText = new TextField(); _statusText.width = 400; _statusText.height = 25; _statusText.x = (stage.stageWidth - _statusText.width) / 2; _statusText.y = 150; var statusTextFormat:TextFormat = new TextFormat(); statusTextFormat.color = 0xeeeeee; statusTextFormat.font = "Verdana"; statusTextFormat.align = TextFormatAlign.CENTER; statusTextFormat.size = 16; _statusText.defaultTextFormat = statusTextFormat; _statusText.wordWrap = false; _statusText.opaqueBackground = 0x999999; _statusText.selectable = false; _statusText.text = "Initializing..."; addChild(_statusText); } private function createProgressBar():void { _progressBarRect = new Shape(); _progressBarRect.graphics.beginFill(0x000000, 0); _progressBarRect.graphics.lineStyle(2, 0x000000); _progressBarRect.graphics.drawRect(0, 0, 400, 30); _progressBarRect.graphics.endFill(); _progressBarRect.x = (stage.stageWidth - _progressBarRect.width) / 2; _progressBarRect.y = 100; addChild(_progressBarRect); _progressBar = new Shape(); _progressBar.graphics.beginFill(0x0000ee); _progressBar.graphics.drawRect(0, 0, 391, 21); _progressBar.x = _progressBarRect.x + 4; _progressBar.y = _progressBarRect.y + 4; addChild(_progressBar); _progressBar.scaleX = 0; } private function setPercentComplete(percentComplete:int):void { if (_currentPercentComplete == percentComplete) return; _currentPercentComplete = percentComplete; invalidateValue(); } private function invalidateValue():void { if (_needsValidation) return; _needsValidation = true; addEventListener(Event.EXIT_FRAME, validate); } private function validate(event:Event):void { removeEventListener(Event.EXIT_FRAME, validate); _needsValidation = false; _redrawProgressBar(); } private function _redrawProgressBar():void { _progressBar.scaleX = _currentPercentComplete / 100; } } }
initialize()
yönteminde, üst worker (işçi) öğesinin iletildiği MessageChannel nesnelerini alır. Bunlar iki worker (işçi) öğesi arasında iletişim için kullanılır.
Üst worker (işçi) bir mesaj göndermek için commandChannel
mesaj kanalında send()
yöntemini çağırır. Arka plan worker (işçi) öğesinde çalışma zamanı, handleCommandMessage()
yöntemini çağırarak channelMessage
olayını gönderir.
Arka plan worker (işçi) öğesinin gerçek işi, count()
yönteminde gerçekleşir. Arka plan worker (işçi) sayımına devam ettikçe, progressChannel
MessageChannel nesnesinde send()
yöntemini çağırarak üst worker (işçi) öğesine ilerleme mesajları gönderir. Sayımı bittiğinde, resultChannel
MessageChannel nesnesinde send()
yöntemini çağırır.
package com.adobe.example.workers { import com.adobe.example.vo.CountResult; import flash.display.Sprite; import flash.events.Event; import flash.net.registerClassAlias; import flash.system.MessageChannel; import flash.system.Worker; import flash.utils.getTimer; public class BackgroundWorker extends Sprite { private var commandChannel:MessageChannel; private var progressChannel:MessageChannel; private var resultChannel:MessageChannel; public function BackgroundWorker() { initialize(); } private function initialize():void { registerClassAlias("com.adobe.test.vo.CountResult", CountResult); // Get the MessageChannel objects to use for communicating between workers // This one is for receiving messages from the parent worker commandChannel = Worker.current.getSharedProperty("incomingCommandChannel") as MessageChannel; commandChannel.addEventListener(Event.CHANNEL_MESSAGE, handleCommandMessage); // These are for sending messages to the parent worker progressChannel = Worker.current.getSharedProperty("progressChannel") as MessageChannel; resultChannel = Worker.current.getSharedProperty("resultChannel") as MessageChannel; } private function handleCommandMessage(event:Event):void { if (!commandChannel.messageAvailable) return; var message:Array = commandChannel.receive() as Array; if (message != null && message[0] == "startCount") { count(uint(message[1])); } } private function count(targetValue:uint):void { var startTime:int = getTimer(); var onePercent:uint = uint(Math.ceil(targetValue / 100)); var oneHalfPercent:Number = onePercent / 2; var i:uint = 0; while (i < targetValue) { i++; // only send progress messages every one-half-percent milestone // to avoid flooding the message channel if (i % oneHalfPercent == 0) { progressChannel.send(i / onePercent); } } var elapsedTime:int = getTimer() - startTime; var result:CountResult = new CountResult(targetValue, elapsedTime / 1000); resultChannel.send(result); trace("counted to", targetValue.toString(), "in", elapsedTime, "milliseconds"); } } }
registerClassAlias()
yöntemini çağırır.
package com.adobe.example.vo { public class CountResult { public function CountResult(countTarget:uint=0, countTime:Number=0) { this.countTarget = countTarget; this.countDurationSeconds = countTime; } public var countTarget:uint; public var countDurationSeconds:Number; } }
1. ActionScript kodu içeren bir uzak SWF'nin dinamik olarak yüklenmesi çalışmadığından, uzak SWF çalışana kesilen SWF olarak geçirilmelidir. 2. [Embed] etiketi kullanılarak SWF'lerin (ABC koduna sahip) gömülmesi iOS'ta çalışmaz. Her ek çalışan ayrı bir SWF'den oluşturulur. Yeni bir Worker sınıfı örneği oluşturmak için, arka plan worker (işçi) öğesinin swf baytlarını içeren bir ByteArray öğesini WorkerDomain sınıfının createWorker()
yöntemine argüman olarak iletin.
İOS'ta bu amaçla bir SWF'nin baytlarına erişmenin iki genel yolu vardır: Birinci yolu bir dış SWF dosyası yüklemek için Loader
kullanılması, ikinci yolu ise SWF dosyasını yüklemek için URLLoader
kullanılmasıdır.
Aşağıdaki örnekte SWF dosyasını yüklemek için Loader
API'sı kullanılır.
package { import flash.display.Loader; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.IOErrorEvent; import flash.net.URLRequest; import flash.system.ApplicationDomain; import flash.system.LoaderContext; import flash.system.MessageChannel; import flash.system.Worker; import flash.system.WorkerDomain; import flash.text.TextField; import flash.text.TextFormat; public class IOSWorkerExample extends Sprite { public var worker:Worker; public var bm:MessageChannel; public var mb:MessageChannel; public var tf:TextField; public var tfrmt:TextFormat; public function IOSWorkerExample() { super(); stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; tf=new TextField(); tfrmt= new TextFormat() tfrmt.size=80; tf.textColor = 0xFFFFF; tf.defaultTextFormat=tfrmt; addChild(tf); //creating the urlRequest object that references the background worker. var _urlRequest:URLRequest = new URLRequest("IOSBackWorker.swf"); var _loader:Loader = new Loader(); var _lc:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null); _loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler); _loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,errorHandler); _loader.load(_urlRequest, _lc); } // This function is called once the swf loading is completed public function completeHandler(e:Event):void { worker = WorkerDomain.current.createWorker(e.target.bytes); bm = worker.createMessageChannel(Worker.current); mb = Worker.current.createMessageChannel(worker); worker.setSharedProperty("btm", bm); worker.setSharedProperty("mtb", mb); //adding event handler on message receive from background bm.addEventListener(Event.CHANNEL_MESSAGE, onBackToMain); worker.start(); bm.receive(true); } public function errorHandler(e:IOErrorEvent):void { trace("In IO ErrorEvent Handler "+e.text); } //This function is called when the main thread receives the message from the background worker. public function onBackToMain(event:Event):void { if(bm.messageAvailable) { // displaying the percentages based on the message received from the background. var progress:Number = bm.receive(); trace("progress "+progress); tf.text= progress.toString(); } } } }
Loader
öğesinin yükleme işlevi çağrıldığında kod yürütüldüğünden, arka plan çalışanına bu örnekte gösterildiği gibi bir isPrimordial
özellik işareti koyulması gerekir.
package { import flash.display.Sprite; import flash.system.MessageChannel; import flash.system.Worker; import flash.utils.ByteArray; import flash.utils.getTimer; public class IOSBackWorker extends Sprite { private var memory:ByteArray = new ByteArray(); private var bm:MessageChannel; private var mb:MessageChannel; public function IOSBackWorker() { if(!Worker.current.isPrimordial) { memory.shareable = true; // creating objects of message channels bm = Worker.current.getSharedProperty("btm"); mb = Worker.current.getSharedProperty("mtb"); // calculating the percentage trace("message came"); var j:Number =1; while (j<1000) { for(var i=0;i<100;i++){} var startTime=getTimer(); // adding delay while (getTimer()-startTime <100); trace(j, (100*j)/1000); var progress:Number=(100*j)/1000; // sending the percentage to the main thread bm.send(progress); j++; } } } } }
Tue Jun 12 2018, 01:09 PM Z