ActionScript® 3.0 — dokumentacja dla platformy Adobe® Flash®
Strona główna  |  Ukryj listę pakietów i klas |  Pakiety  |  Klasy  |  Nowości  |  Indeks  |  Dodatki  |  Dlaczego język angielski?
Filtry: AIR 30.0 i wcześniejsze, Flash Player 30.0 i wcześniejsze, Flash Lite 4
Flex 4.6 i wcześniejsze, Flash Pro CS6 i wcześniejsze
Ukryj filtry
flash.system 

Worker  - AS3

Pakietyx

Najwyższy poziom
adobe.utils
air.desktop
air.net
air.update
air.update.events
coldfusion.air
coldfusion.air.errors
coldfusion.air.events
coldfusion.service
coldfusion.service.events
coldfusion.service.mxml
com.adobe.acm.solutions.authoring.domain.extensions
com.adobe.acm.solutions.ccr.domain.extensions
com.adobe.consulting.pst.vo
com.adobe.dct.component
com.adobe.dct.component.datadictionary
com.adobe.dct.component.datadictionaryElement
com.adobe.dct.component.dataElementsPanel
com.adobe.dct.component.toolbars
com.adobe.dct.event
com.adobe.dct.exp
com.adobe.dct.model
com.adobe.dct.service
com.adobe.dct.service.provider
com.adobe.dct.transfer
com.adobe.dct.util
com.adobe.dct.view
com.adobe.ep.taskmanagement.domain
com.adobe.ep.taskmanagement.event
com.adobe.ep.taskmanagement.filter
com.adobe.ep.taskmanagement.services
com.adobe.ep.taskmanagement.util
com.adobe.ep.ux.attachmentlist.component
com.adobe.ep.ux.attachmentlist.domain
com.adobe.ep.ux.attachmentlist.domain.events
com.adobe.ep.ux.attachmentlist.domain.renderers
com.adobe.ep.ux.attachmentlist.skin
com.adobe.ep.ux.attachmentlist.skin.renderers
com.adobe.ep.ux.content.event
com.adobe.ep.ux.content.factory
com.adobe.ep.ux.content.handlers
com.adobe.ep.ux.content.managers
com.adobe.ep.ux.content.model.asset
com.adobe.ep.ux.content.model.preview
com.adobe.ep.ux.content.model.relation
com.adobe.ep.ux.content.model.search
com.adobe.ep.ux.content.model.toolbar
com.adobe.ep.ux.content.search
com.adobe.ep.ux.content.services
com.adobe.ep.ux.content.services.load
com.adobe.ep.ux.content.services.permissions
com.adobe.ep.ux.content.services.preview
com.adobe.ep.ux.content.services.providers
com.adobe.ep.ux.content.services.query
com.adobe.ep.ux.content.services.relationships
com.adobe.ep.ux.content.services.search.lccontent
com.adobe.ep.ux.content.services.version
com.adobe.ep.ux.content.view
com.adobe.ep.ux.content.view.components.activate
com.adobe.ep.ux.content.view.components.grid
com.adobe.ep.ux.content.view.components.grid.hover
com.adobe.ep.ux.content.view.components.grid.hover.component
com.adobe.ep.ux.content.view.components.grid.renderers
com.adobe.ep.ux.content.view.components.relationships
com.adobe.ep.ux.content.view.components.review
com.adobe.ep.ux.content.view.components.search.renderers
com.adobe.ep.ux.content.view.components.searchpod
com.adobe.ep.ux.content.view.components.toolbar
com.adobe.ep.ux.content.view.components.toolbar.controlRenderers
com.adobe.ep.ux.content.view.components.version
com.adobe.ep.ux.documentsubmit.component
com.adobe.ep.ux.documentsubmit.domain
com.adobe.ep.ux.documentsubmit.skin
com.adobe.ep.ux.taskaction.component
com.adobe.ep.ux.taskaction.domain
com.adobe.ep.ux.taskaction.domain.events
com.adobe.ep.ux.taskaction.skin
com.adobe.ep.ux.taskdetails.component
com.adobe.ep.ux.taskdetails.domain
com.adobe.ep.ux.taskdetails.skin
com.adobe.ep.ux.tasklist.component
com.adobe.ep.ux.tasklist.domain
com.adobe.ep.ux.tasklist.skin
com.adobe.ep.ux.webdocumentviewer.domain
com.adobe.exm.expression
com.adobe.exm.expression.error
com.adobe.exm.expression.event
com.adobe.exm.expression.impl
com.adobe.fiber.runtime.lib
com.adobe.fiber.services
com.adobe.fiber.services.wrapper
com.adobe.fiber.styles
com.adobe.fiber.util
com.adobe.fiber.valueobjects
com.adobe.gravity.binding
com.adobe.gravity.context
com.adobe.gravity.flex.bundleloader
com.adobe.gravity.flex.progress
com.adobe.gravity.flex.serviceloader
com.adobe.gravity.framework
com.adobe.gravity.init
com.adobe.gravity.service.bundleloader
com.adobe.gravity.service.logging
com.adobe.gravity.service.manifest
com.adobe.gravity.service.progress
com.adobe.gravity.tracker
com.adobe.gravity.ui
com.adobe.gravity.utility
com.adobe.gravity.utility.async
com.adobe.gravity.utility.error
com.adobe.gravity.utility.events
com.adobe.gravity.utility.factory
com.adobe.gravity.utility.flex.async
com.adobe.gravity.utility.logging
com.adobe.gravity.utility.message
com.adobe.gravity.utility.sequence
com.adobe.gravity.utility.url
com.adobe.guides.control
com.adobe.guides.domain
com.adobe.guides.i18n
com.adobe.guides.spark.components.skins
com.adobe.guides.spark.components.skins.mx
com.adobe.guides.spark.headers.components
com.adobe.guides.spark.headers.skins
com.adobe.guides.spark.layouts.components
com.adobe.guides.spark.layouts.skins
com.adobe.guides.spark.navigators.components
com.adobe.guides.spark.navigators.renderers
com.adobe.guides.spark.navigators.skins
com.adobe.guides.spark.util
com.adobe.guides.spark.wrappers.components
com.adobe.guides.spark.wrappers.skins
com.adobe.guides.submit
com.adobe.icc.dc.domain
com.adobe.icc.dc.domain.factory
com.adobe.icc.editors.events
com.adobe.icc.editors.handlers
com.adobe.icc.editors.managers
com.adobe.icc.editors.model
com.adobe.icc.editors.model.config
com.adobe.icc.editors.model.el
com.adobe.icc.editors.model.el.operands
com.adobe.icc.editors.model.el.operators
com.adobe.icc.enum
com.adobe.icc.external.dc
com.adobe.icc.obj
com.adobe.icc.services
com.adobe.icc.services.category
com.adobe.icc.services.config
com.adobe.icc.services.download
com.adobe.icc.services.export
com.adobe.icc.services.external
com.adobe.icc.services.formbridge
com.adobe.icc.services.fragmentlayout
com.adobe.icc.services.layout
com.adobe.icc.services.letter
com.adobe.icc.services.locator
com.adobe.icc.services.module
com.adobe.icc.services.render
com.adobe.icc.services.submit
com.adobe.icc.services.user
com.adobe.icc.token
com.adobe.icc.vo
com.adobe.icc.vo.render
com.adobe.icomm.assetplacement.controller
com.adobe.icomm.assetplacement.controller.utils
com.adobe.icomm.assetplacement.data
com.adobe.icomm.assetplacement.model
com.adobe.livecycle.assetmanager.client
com.adobe.livecycle.assetmanager.client.event
com.adobe.livecycle.assetmanager.client.handler
com.adobe.livecycle.assetmanager.client.managers
com.adobe.livecycle.assetmanager.client.model
com.adobe.livecycle.assetmanager.client.model.cms
com.adobe.livecycle.assetmanager.client.service
com.adobe.livecycle.assetmanager.client.service.search
com.adobe.livecycle.assetmanager.client.service.search.cms
com.adobe.livecycle.assetmanager.client.utils
com.adobe.livecycle.content
com.adobe.livecycle.rca.model
com.adobe.livecycle.rca.model.constant
com.adobe.livecycle.rca.model.document
com.adobe.livecycle.rca.model.participant
com.adobe.livecycle.rca.model.reminder
com.adobe.livecycle.rca.model.stage
com.adobe.livecycle.rca.service
com.adobe.livecycle.rca.service.core
com.adobe.livecycle.rca.service.core.delegate
com.adobe.livecycle.rca.service.process
com.adobe.livecycle.rca.service.process.delegate
com.adobe.livecycle.rca.token
com.adobe.livecycle.ria.security.api
com.adobe.livecycle.ria.security.service
com.adobe.mosaic.layouts
com.adobe.mosaic.layouts.dragAndDrop
com.adobe.mosaic.layouts.interfaces
com.adobe.mosaic.mxml
com.adobe.mosaic.om.constants
com.adobe.mosaic.om.events
com.adobe.mosaic.om.impl
com.adobe.mosaic.om.interfaces
com.adobe.mosaic.skinning
com.adobe.mosaic.sparklib.editors
com.adobe.mosaic.sparklib.optionMenu
com.adobe.mosaic.sparklib.scrollableMenu
com.adobe.mosaic.sparklib.scrollableMenu.skins
com.adobe.mosaic.sparklib.tabLayout
com.adobe.mosaic.sparklib.tabLayout.events
com.adobe.mosaic.sparklib.tabLayout.layouts
com.adobe.mosaic.sparklib.tabLayout.skins
com.adobe.mosaic.sparklib.text
com.adobe.mosaic.sparklib.util
com.adobe.solutions.acm.authoring.presentation
com.adobe.solutions.acm.authoring.presentation.actionbar
com.adobe.solutions.acm.authoring.presentation.common
com.adobe.solutions.acm.authoring.presentation.events
com.adobe.solutions.acm.authoring.presentation.fragment
com.adobe.solutions.acm.authoring.presentation.letter
com.adobe.solutions.acm.authoring.presentation.letter.data
com.adobe.solutions.acm.authoring.presentation.preview
com.adobe.solutions.acm.authoring.presentation.rte
com.adobe.solutions.acm.ccr.presentation
com.adobe.solutions.acm.ccr.presentation.contentcapture
com.adobe.solutions.acm.ccr.presentation.contentcapture.events
com.adobe.solutions.acm.ccr.presentation.contentcapture.preview
com.adobe.solutions.acm.ccr.presentation.datacapture
com.adobe.solutions.acm.ccr.presentation.datacapture.renderers
com.adobe.solutions.acm.ccr.presentation.pdf
com.adobe.solutions.exm
com.adobe.solutions.exm.authoring
com.adobe.solutions.exm.authoring.components.controls
com.adobe.solutions.exm.authoring.components.toolbars
com.adobe.solutions.exm.authoring.domain
com.adobe.solutions.exm.authoring.domain.expression
com.adobe.solutions.exm.authoring.domain.impl
com.adobe.solutions.exm.authoring.domain.method
com.adobe.solutions.exm.authoring.domain.variable
com.adobe.solutions.exm.authoring.enum
com.adobe.solutions.exm.authoring.events
com.adobe.solutions.exm.authoring.model
com.adobe.solutions.exm.authoring.renderer
com.adobe.solutions.exm.authoring.view
com.adobe.solutions.exm.expression
com.adobe.solutions.exm.impl
com.adobe.solutions.exm.impl.method
com.adobe.solutions.exm.method
com.adobe.solutions.exm.mock
com.adobe.solutions.exm.mock.method
com.adobe.solutions.exm.runtime
com.adobe.solutions.exm.runtime.impl
com.adobe.solutions.exm.variable
com.adobe.solutions.prm.constant
com.adobe.solutions.prm.domain
com.adobe.solutions.prm.domain.factory
com.adobe.solutions.prm.domain.impl
com.adobe.solutions.prm.domain.manager
com.adobe.solutions.prm.presentation.asset
com.adobe.solutions.prm.presentation.constant
com.adobe.solutions.prm.presentation.document
com.adobe.solutions.prm.presentation.event
com.adobe.solutions.prm.presentation.file
com.adobe.solutions.prm.presentation.project
com.adobe.solutions.prm.presentation.team
com.adobe.solutions.prm.presentation.util
com.adobe.solutions.prm.service
com.adobe.solutions.prm.services.impl
com.adobe.solutions.prm.vo
com.adobe.solutions.rca.constant
com.adobe.solutions.rca.domain
com.adobe.solutions.rca.domain.common
com.adobe.solutions.rca.domain.factory
com.adobe.solutions.rca.domain.impl
com.adobe.solutions.rca.domain.impl.manager
com.adobe.solutions.rca.domain.manager
com.adobe.solutions.rca.presentation
com.adobe.solutions.rca.presentation.comment
com.adobe.solutions.rca.presentation.constant
com.adobe.solutions.rca.presentation.event
com.adobe.solutions.rca.presentation.gantt
com.adobe.solutions.rca.presentation.gantt.ruler
com.adobe.solutions.rca.presentation.template
com.adobe.solutions.rca.presentation.template.audit
com.adobe.solutions.rca.presentation.template.definition
com.adobe.solutions.rca.presentation.template.documents
com.adobe.solutions.rca.presentation.template.stages
com.adobe.solutions.rca.presentation.util
com.adobe.solutions.rca.service
com.adobe.solutions.rca.services.impl
com.adobe.solutions.rca.vo
com.adobe.solutions.rca.vo.um
com.adobe.viewsource
fl.accessibility
fl.containers
fl.controls
fl.controls.dataGridClasses
fl.controls.listClasses
fl.controls.progressBarClasses
fl.core
fl.data
fl.display
fl.events
fl.ik
fl.lang
fl.livepreview
fl.managers
fl.motion
fl.motion.easing
fl.rsl
fl.text
fl.transitions
fl.transitions.easing
fl.video
flash.accessibility
flash.concurrent
flash.crypto
flash.data
flash.desktop
flash.display
flash.display3D
flash.display3D.textures
flash.errors
flash.events
flash.external
flash.filesystem
flash.filters
flash.geom
flash.globalization
flash.html
flash.media
flash.net
flash.net.dns
flash.net.drm
flash.notifications
flash.permissions
flash.printing
flash.profiler
flash.sampler
flash.security
flash.sensors
flash.system
flash.text
flash.text.engine
flash.text.ime
flash.ui
flash.utils
flash.xml
flashx.textLayout
flashx.textLayout.compose
flashx.textLayout.container
flashx.textLayout.conversion
flashx.textLayout.edit
flashx.textLayout.elements
flashx.textLayout.events
flashx.textLayout.factory
flashx.textLayout.formats
flashx.textLayout.operations
flashx.textLayout.utils
flashx.undo
ga.controls
ga.layouts
ga.model
ga.uiComponents
ga.util
ga.views
ga.wrappers
lc.foundation
lc.foundation.domain
lc.foundation.events
lc.foundation.ui
lc.foundation.util
lc.preloader
lc.procmgmt
lc.procmgmt.commands
lc.procmgmt.domain
lc.procmgmt.events
lc.procmgmt.formbridge
lc.procmgmt.impl
lc.procmgmt.ui.attachments
lc.procmgmt.ui.controls
lc.procmgmt.ui.controls.card
lc.procmgmt.ui.controls.renderer
lc.procmgmt.ui.help
lc.procmgmt.ui.layout
lc.procmgmt.ui.presentationmodel
lc.procmgmt.ui.process
lc.procmgmt.ui.search
lc.procmgmt.ui.startpoint
lc.procmgmt.ui.task
lc.procmgmt.ui.task.form
lc.procmgmt.ui.task.form.commands
lc.procmgmt.ui.tracking
mx.accessibility
mx.automation
mx.automation.air
mx.automation.delegates
mx.automation.delegates.advancedDataGrid
mx.automation.delegates.charts
mx.automation.delegates.containers
mx.automation.delegates.controls
mx.automation.delegates.controls.dataGridClasses
mx.automation.delegates.controls.fileSystemClasses
mx.automation.delegates.core
mx.automation.delegates.flashflexkit
mx.automation.events
mx.binding
mx.binding.utils
mx.charts
mx.charts.chartClasses
mx.charts.effects
mx.charts.effects.effectClasses
mx.charts.events
mx.charts.renderers
mx.charts.series
mx.charts.series.items
mx.charts.series.renderData
mx.charts.styles
mx.collections
mx.collections.errors
mx.containers
mx.containers.accordionClasses
mx.containers.dividedBoxClasses
mx.containers.errors
mx.containers.utilityClasses
mx.controls
mx.controls.advancedDataGridClasses
mx.controls.dataGridClasses
mx.controls.listClasses
mx.controls.menuClasses
mx.controls.olapDataGridClasses
mx.controls.scrollClasses
mx.controls.sliderClasses
mx.controls.textClasses
mx.controls.treeClasses
mx.controls.videoClasses
mx.core
mx.core.windowClasses
mx.data
mx.data.crypto
mx.data.errors
mx.data.events
mx.data.messages
mx.data.mxml
mx.data.offline.errors
mx.data.utils
mx.effects
mx.effects.easing
mx.effects.effectClasses
mx.events
mx.filters
mx.flash
mx.formatters
mx.geom
mx.graphics
mx.graphics.codec
mx.graphics.shaderClasses
mx.logging
mx.logging.errors
mx.logging.targets
mx.managers
mx.messaging
mx.messaging.channels
mx.messaging.config
mx.messaging.errors
mx.messaging.events
mx.messaging.management
mx.messaging.messages
mx.modules
mx.netmon
mx.olap
mx.olap.aggregators
mx.preloaders
mx.printing
mx.resources
mx.rpc
mx.rpc.events
mx.rpc.http
mx.rpc.http.mxml
mx.rpc.livecycle
mx.rpc.mxml
mx.rpc.remoting
mx.rpc.remoting.mxml
mx.rpc.soap
mx.rpc.soap.mxml
mx.rpc.wsdl
mx.rpc.xml
mx.skins
mx.skins.halo
mx.skins.spark
mx.skins.wireframe
mx.skins.wireframe.windowChrome
mx.states
mx.styles
mx.utils
mx.validators
org.osmf.containers
org.osmf.display
org.osmf.elements
org.osmf.events
org.osmf.layout
org.osmf.logging
org.osmf.media
org.osmf.metadata
org.osmf.net
org.osmf.net.dvr
org.osmf.net.httpstreaming
org.osmf.net.metrics
org.osmf.net.qos
org.osmf.net.rtmpstreaming
org.osmf.net.rules
org.osmf.traits
org.osmf.utils
spark.accessibility
spark.automation.delegates
spark.automation.delegates.components
spark.automation.delegates.components.gridClasses
spark.automation.delegates.components.mediaClasses
spark.automation.delegates.components.supportClasses
spark.automation.delegates.skins.spark
spark.automation.events
spark.collections
spark.components
spark.components.calendarClasses
spark.components.gridClasses
spark.components.mediaClasses
spark.components.supportClasses
spark.components.windowClasses
spark.core
spark.effects
spark.effects.animation
spark.effects.easing
spark.effects.interpolation
spark.effects.supportClasses
spark.events
spark.filters
spark.formatters
spark.formatters.supportClasses
spark.globalization
spark.globalization.supportClasses
spark.layouts
spark.layouts.supportClasses
spark.managers
spark.modules
spark.preloaders
spark.primitives
spark.primitives.supportClasses
spark.skins
spark.skins.mobile
spark.skins.mobile.supportClasses
spark.skins.spark
spark.skins.spark.mediaClasses.fullScreen
spark.skins.spark.mediaClasses.normal
spark.skins.spark.windowChrome
spark.skins.wireframe
spark.skins.wireframe.mediaClasses
spark.skins.wireframe.mediaClasses.fullScreen
spark.transitions
spark.utils
spark.validators
spark.validators.supportClasses
xd.core.axm.enterprise.view.components
xd.core.axm.enterprise.view.skins
xd.core.axm.view.components
xd.core.axm.view.components.support

Elementy językowe

Stałe globalne
Funkcje globalne
Operatory
Instrukcje, słowa kluczowe i dyrektywy
Typy specjalne

Dodatki

Nowości
Błędy kompilatora
Ostrzeżenia kompilatora
Błędy czasu wykonywania
Migracja kodu ActionScript 3
Obsługiwane zestawy znaków
Tylko MXML
Elementy XML dotyczące ruchu
Znaczniki tekstu z synchronizacją czasową
Przestarzały indeks
Stałe implementacji dostępności
Instrukcje dotyczące przykładów
Informacje prawne
Pakietflash.system
Klasapublic final class Worker
DziedziczenieWorker Inheritance EventDispatcher Inheritance Object

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Obiekt Worker reprezentuje proces roboczy, czyli wirtualne wystąpienie środowiska wykonawczego Flash. Każde wystąpienie obiektu Worker steruje cyklem życia danych współużytkowanych pojedynczego procesu roboczego i dostępem do nich.

Proces roboczy umożliwia wykonywanie kodu w tle — w czasie, gdy inny proces roboczy (łącznie z głównym procesem roboczym pliku SWF) wykonuje operacje. W przypadku braku procesów roboczych niektóre operacje, takie jak przetwarzanie dużego zbioru danych w pętli, zajmują tak dużo czasu, że uniemożliwiają głównemu wątkowi aplikacji odpowiednio szybkie aktualizowanie ekranu. Może to spowodować przerwy w wyświetlaniu lub blokowanie zawartości ekranu.

Procesy robocze pozwalają na wykonywanie długotrwałych lub powolnych operacji w tle. Każdy proces roboczy wykonuje kod w wątku odseparowanym do innych procesów roboczych. W ten sposób kod wykonywany przez dłuższy czas nie blokuje wykonywania kodu w innym procesie roboczym. Dzięki temu dwa zastawy kodu mogą być wykonywane równolegle. W rezultacie proces roboczy może służyć do wykonywania kodu w tle, a główny wątek aplikacji może kontynuować płynne aktualizowanie ekranu.

Możliwość jednoczesnego wykonywania wielu zestawów instrukcji kodu jest określana jako współbieżność.

Uwaga: Stosowanie procesów roboczych na potrzeby współbieżności jest obsługiwane w programie Flash Player oraz w środowisku AIR na platformach komputerowych. Na platformach przenośnych współbieżność jest obsługiwana w środowisku AIR w systemach Android i iOS. Przed próbą zastosowania współbieżności można sprawdzić, czy funkcja ta jest obsługiwana, korzystając z właściwości statycznej isSupported.

Wystąpień klasy Worker nie tworzy się przez bezpośrednie wywołanie konstruktora Worker(). W przypadku kontekstów obsługujących stosowanie procesów roboczych na potrzeby współbieżności środowisko wykonawcze automatycznie tworzy proces roboczy powiązany z głównym plikiem SWF, określany jako pierwotny procese roboczy.

Każdy dodatkowy proces roboczy jest tworzony z oddzielnego pliku SWF. Aby utworzyć nowe wystąpienie klasy Worker, należy przekazać obiekt ByteArray z bajtami pliku SWF procesu roboczego działającego w tle jako argument metody createWorker() klasy WorkerDomain. Istnieją trzy typowe metody uzyskiwania dostępu do bajtów pliku SWF stosowane w takich sytuacjach:

  • Użycie znacznika meta [Embed] i osadzenie pliku SWF w aplikacji jako obiektu ByteArray:

     // 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();
     }
  • Wczytanie zewnętrznego pliku SWF przy użyciu klasy URLLoader:

     // 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();
     }
  • Użycie pojedynczego pliku SWF jako pierwotnego procesu roboczego i procesu roboczego działającego w tle:

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

Procesy robocze są odizolowane od innych procesów roboczych i nie mają dostępu do tych samych zasobów pamięci, zmiennych i kodu. Dostępne są trzy mechanizmy umożliwiające przekazywanie komunikatów i danych między wystąpieniami procesów klasy Worker:

  • Właściwości współużytkowane: Każdy proces roboczy zawiera własny zestaw nazwanych wartości, które można ustawić i odczytać z poziomu danego procesu roboczego lub innych procesów roboczych. Metoda setSharedProperty() pozwala ustawić wartość, a metoda getSharedProperty() umożliwia odczytanie wartości.
  • MessageChannel: Obiekt MessageChannel umożliwia jednokierunkowe wysyłanie komunikatów i danych między procesami roboczymi. Kod w odbierającym procesie roboczym może wykrywać zdarzenia powiadamiające o nowych komunikatach. Obiekt MessageChannel można utworzyć przy użyciu metody createMessageChannel().
  • Współużytkowany obiekt ByteArray: Jeśli właściwość shareable obiektu ByteArray ma wartość true, dla wystąpień tego obiektu ByteArray we wszystkich procesach roboczych jest używana ta sama pamięć podstawowa. Kod wielu procesów roboczych może jednocześnie korzystać z pamięci współużytkowanej, dlatego w kodzie należy zastosować mechanizm przedstawiony w opisie właściwości ByteArray.shareable. Pozwoli to uniknąć problemów wynikających z nieoczekiwanych zmian danych.

W przypadku kodu wykonywanego w procesie roboczym działającym w tle niektóre interfejsy API czasu wykonywania są niedostępne. Dotyczy to głównie interfejsów API powiązanych z mechanizmami wejścia i wyjścia danych lub elementami systemu operacyjnego, takimi jak okna oraz przeciąganie. Przed użyciem interfejsu API nieobsługiwanego w pewnych kontekstach należy za pomocą właściwości isSupported, available lub podobnej sprawdzić, czy interfejs API jest dostępny w kontekście procesu roboczego działającego w tle.

Uwaga: rozszerzenia natywne nie są obsługiwane dla procesów roboczych działających w tle oraz wtórnych.

Przydatność procesów roboczych polega na możliwości redukcji prawdopodobieństwa pominięcia klatek animacji spowodowanego blokowaniem głównego wątku renderującego przez inny kod. Jednak procesy robocze wymagają większej ilości pamięci systemowej i zwiększają obciążenie procesora, co może mieć negatywny wpływ na ogólną wydajność aplikacji. Każdy proces roboczy używa własnego wystąpienia maszyny wirtualnej środowiska wykonawczego, dlatego nawet niewielki obiekt może wprowadzać duży narzut związany z dodatkowymi operacjami. Wprowadzając do kodu procesy robocze, należy go przetestować na wszystkich platformach docelowych i upewnić się, że obciążenie systemu nie jest za duże. Firma Adobe zaleca, aby w typowych sytuacjach nie używać więcej niż dwóch procesów roboczych działających w tle.

Wyświetl przykłady

Więcej informacji

Powiązane elementy interfejsu API



Właściwości publiczne
 WłaściwośćZdefiniowane przez
 Inheritedconstructor : Object
Odwołanie do obiektu klasy lub funkcji konstruktora, dotyczące danej instancji obiektu.
Object
  current : Worker
[statyczny] [tylko do odczytu] Umożliwia dostęp do procesu roboczego, który zawiera bieżący kod.
Worker
  isPrimordial : Boolean
[tylko do odczytu] Określa, czy dany proces roboczy jest pierwotnym procesem roboczym.
Worker
  isSupported : Boolean
[statyczny] [tylko do odczytu] Wskazuje, czy bieżący kontekst środowiska wykonawczego obsługuje obiekty Worker na potrzeby współbieżnego wykonywania kodu.
Worker
  state : String
[tylko do odczytu] Bieżący stan cyklu życia procesu roboczego.
Worker
Metody publiczne
 MetodaZdefiniowane przez
  
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
[przesłanianie] Rejestruje obiekt detektora zdarzeń w obiekcie EventDispatcher, dzięki czemu detektor będzie otrzymywał powiadomienia o zdarzeniu.
Worker
  
Tworzy nowe wystąpienie klasy MessageChannel na potrzeby wysyłania komunikatów z procesu roboczego, w którym metoda jest wywoływana, do innego, odbierającego procesu roboczego.
Worker
 Inherited
Wywołuje zdarzenie, tj. kieruje je do przepływu zdarzeń.
EventDispatcher
  
Pobiera wartość zapisaną w tym procesie roboczym z nazwanym kluczem.
Worker
 Inherited
Sprawdza, czy obiekt EventDispatcher zawiera jakiekolwiek detektory zarejestrowane dla konkretnego typu zdarzeń.
EventDispatcher
 Inherited
Wskazuje, czy dla obiektu zdefiniowano określoną właściwość.
Object
 Inherited
Wskazuje, czy instancja klasy Object należy do łańcucha prototypów obiektu określonego jako parametr.
Object
 Inherited
Wskazuje, czy określona właściwość istnieje i jest przeliczalna.
Object
  
removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
[przesłanianie] Usuwa detektor z obiektu EventDispatcher.
Worker
 Inherited
Ustawia dostępność właściwości dynamicznej używanej w pętlach.
Object
  
Udostępnia nazwaną wartość, która jest dostępna dla kodu działającego w pliku SWF procesu roboczego.
Worker
  
Rozpoczyna wykonywanie procesu roboczego.
Worker
  
Zatrzymuje wykonywanie kodu procesu roboczego.
Worker
 Inherited
Zwraca ciąg reprezentujący obiekt — sformatowany zgodnie z konwencjami właściwymi dla ustawień regionalnych.
Object
 Inherited
Zwraca ciąg reprezentujący określony obiekt.
Object
 Inherited
Zwraca pierwotną wartość dla określonego obiektu.
Object
 Inherited
Sprawdza, czy detektor zdarzeń określonego typu jest zarejestrowany w tym obiekcie EventDispatcher lub jego elementach macierzystych.
EventDispatcher
Zdarzenia
 Zdarzenie Podsumowanie Zdefiniowane przez
 Inherited[zdarzenie broadcast] Wywoływane, gdy program Flash Player lub aplikacja środowiska wykonawczego AIR uzyskuje fokus w systemie operacyjnym i przechodzi w stan aktywny.EventDispatcher
 Inherited[zdarzenie broadcast] Wywoływane, gdy program Flash Player lub aplikacja AIR traci fokus w systemie operacyjnym i przechodzi w stan nieaktywny.EventDispatcher
  Wywoływane, gdy zmienia się wartość właściwości state procesu roboczego.Worker
Szczegół właściwości

current

właściwość
current:Worker  [tylko do odczytu]

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Umożliwia dostęp do procesu roboczego, który zawiera bieżący kod.



Implementacja
    public static function get current():Worker

isPrimordial

właściwość 
isPrimordial:Boolean  [tylko do odczytu]

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Określa, czy dany proces roboczy jest pierwotnym procesem roboczym.

Pierwotny proces roboczy to proces roboczy, w którym działa początkowy plik SWF. Ten proces roboczy steruje renderowaniem obrazu na ekranie.

Tej właściwości można użyć podczas projektowania aplikacji, w której pierwotny proces roboczy i proces roboczy działający w tle są dwoma wystąpieniami tego samego pliku SWF. Alternatywnym sposobem jest uporządkowanie struktury kodu w taki sposób, aby proces roboczy działający w tle używał innego kodu — skompilowanego do pliku SWF innego niż dla pierwotnego procesu roboczego.



Implementacja
    public function get isPrimordial():Boolean

isSupported

właściwość 
isSupported:Boolean  [tylko do odczytu]

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Wskazuje, czy bieżący kontekst środowiska wykonawczego obsługuje obiekty Worker na potrzeby współbieżnego wykonywania kodu.

Jeśli współbieżność jest dostępna, ta właściwość ma wartość true.



Implementacja
    public static function get isSupported():Boolean

state

właściwość 
state:String  [tylko do odczytu]

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Bieżący stan cyklu życia procesu roboczego. Możliwe wartości dla tej właściwości są zdefiniowane w klasie WorkerState.



Implementacja
    public function get state():String

Powiązane elementy interfejsu API

Szczegół metody

addEventListener

()metoda
override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Rejestruje obiekt detektora zdarzenia w obiekcie EventDispatcher, dzięki czemu detektor będzie otrzymywał powiadomienia o zdarzeniu. We wszystkich węzłach listy wyświetlania można rejestrować detektory zdarzeń reagujące na zdarzenia konkretnego typu, znajdujące się w określonej fazie i mające określony priorytet.

Po pomyślnym zarejestrowaniu detektora zdarzeń nie można zmienić jego priorytetu poprzez dodatkowe wywołania metody addEventListener(). Aby zmienić priorytet detektora, należy najpierw wywołać metodę removeListener(). Następnie można ponownie zarejestrować detektor z nowym poziomem priorytetu.

Należy pamiętać, że po zarejestrowaniu detektora późniejsze wywołania metody addEventListener() z różnymi wartościami type albo useCapture powodują rejestrowanie odrębnych detektorów. Na przykład detektor zarejestrowany z parametrem useCapture ustawionym na true wykrywa tylko zdarzenia w fazie przechwytywania. Po ponownym wywołaniu metody addEventListener() z tym samym obiektem detektora, ale z parametrem useCapture ustawionym na false będą istniały dwa odrębne detektory: jeden wykrywający zdarzenia w fazie przechwytywania, a drugi wykrywający zdarzenia w fazach miejsca docelowego i propagacji.

Nie można zarejestrować detektora zdarzeń, który wykrywałby tylko zdarzenia w fazie miejsca docelowego lub tylko zdarzenia w fazie propagacji. Te fazy są sprzężone podczas rejestracji, ponieważ propagacja zachodzi tylko w przodkach węzła miejsca docelowego.

Gdy detektor zdarzeń przestanie być potrzebny, należy go usunąć, wywołując metodę removeEventListener(); w przeciwnym razie mogą wystąpić problemy w zarządzaniu pamięcią. Detektory zdarzeń nie są automatycznie usuwane z pamięci, ponieważ proces czyszczenia pamięci nie usuwa detektora, pod warunkiem że istnieje obiekt wywołujący (o ile dla parametru useWeakReference ustawiona jest wartość true).

Skopiowanie instancji klasy EventDispatcher nie powoduje skopiowania detektorów zdarzeń dołączonych do tej instancji. (Jeśli utworzono nowy węzeł, dla którego potrzebny jest detektor zdarzeń, należy dołączyć detektor po utworzeniu węzła). Jednak przeniesienie instancji klasy EventDispatcher powoduje również przeniesienia dołączonych do niej detektorów zdarzeń

Jeśli detektor zdarzeń jest rejestrowany w węźle w momencie, gdy ten węzeł przetwarza zdarzenie, detektor nie zostanie wywołany w bieżącej fazie, ale może być wywołany w późniejszej fazie przepływu zdarzeń, np. w fazie propagacji.

Jeśli detektor zdarzeń zostanie usunięty z węzła w momencie, gdy ten węzeł przetwarza zdarzenie, zostanie wywołany przez bieżące operacje. Raz usunięty detektor zdarzeń nie jest nigdy ponownie wywoływany (chyba że zostanie ponownie zarejestrowany na potrzeby dalszego etapu wykonania programu).

Parametry

type:String — Typ zdarzenia.
 
listener:Function — Funkcja detektora, który przetwarza zdarzenie. Ta funkcja musi przyjmować obiekt Event jako swój jedyny parametr i nie może zwracać żadnych wyników, tak jak ilustruje to poniższy przykład:
function(evt:Event):void

Funkcja może mieć dowolną nazwę.

 
useCapture:Boolean (default = false)Określa, czy detektor działa w fazie przechwytywania, czy w fazach miejsca docelowego i propagacji. Jeżeli parametr useCapture jest ustawiony na true, wówczas detektor przetwarza zdarzenie tylko w trakcie fazy przechwytywania, a nie w trakcie fazy miejsca docelowego i propagacji. Jeżeli parametr useCapture ma wartość false, wówczas detektor przetwarza zdarzenie tylko w trakcie fazy miejsca docelowego i propagacji. W celu wykrywania zdarzenia we wszystkich trzech fazach należy wywołać metodę addEventListener dwa razy — raz z parametrem useCapture ustawionym na true, a następnie ponownie, z parametrem useCapture ustawionym na false.
 
priority:int (default = 0) — Poziom priorytetu detektora zdarzeń. Priorytet ma postać 32-bitowej liczby całkowitej ze znakiem. Im wyższa jest liczba, tym wyższy priorytet. Wszystkie detektory z priorytetem n są przetwarzane przed detektorami z priorytetem n-1. Jeżeli dwa lub większa liczba detektorów ma ten sam priorytet, będą one przetwarzane w kolejności, w jakiej zostały dodane. Priorytet domyślny to 0.
 
useWeakReference:Boolean (default = false) — Określa, czy odwołanie do detektora jest mocne, czy słabe. Odwołanie mocne (domyślnie) zapobiega usunięciu detektora przy okazji porządkowania pamięci. Odwołanie słabe temu nie zapobiega.

Funkcje składowe na poziomie klasy nie podlegają porządkowaniu pamięci, zatem można ustawić właściwość useWeakReference na wartość true dla funkcji składowych na poziomie klasy, nie narażając ich na usunięcie. Jeżeli właściwość useWeakReference zostanie ustawiona na wartość true dla detektora, który jest zagnieżdżoną funkcją wewnętrzną, wówczas funkcja będzie usuwana w procesie porządkowania pamięci i przestanie być trwała. W przypadku tworzenia odwołań do funkcji wewnętrznej (zapisania jej w innej zmiennej) nie będzie ona usuwana w procesie porządkowania pamięci i pozostanie trwała.

createMessageChannel

()metoda 
public function createMessageChannel(receiver:Worker):MessageChannel

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Tworzy nowe wystąpienie klasy MessageChannel na potrzeby wysyłania komunikatów z procesu roboczego, w którym metoda jest wywoływana, do innego, odbierającego procesu roboczego. Kod w procesie roboczym, który tworzy obiekt MessageChannel, może go używać w celu (jednokierunkowego) wysyłania komunikatów do obiektu Worker określonego jako argument receiver.

Wystąpienie klasy MessageChannel może służyć do wysyłania komunikatów i danych między różnymi wystąpieniami klasy Worker, jednak należy przekazać co najmniej jedno wystąpienie obiektu MessageChannel do potomnego obiektu Worker jako właściwość współużytkowaną, wywołując metodę setSharedProperty() obiektu Worker.

    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);

Parametry

receiver:Worker — Proces roboczy, który będzie odbierał komunikaty przesyłane za pośrednictwem utworzonego kanału komunikatów.

Zwraca
MessageChannel — Obiekt MessageChannel utworzony za pomocą operacji.

getSharedProperty

()metoda 
public function getSharedProperty(key:String):*

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Pobiera wartość zapisaną w tym procesie roboczym z nazwanym kluczem.

Kod w potomnym procesie roboczym może wywołać tę metodę, aby pobrać wartość już w konstruktorze klasy głównej pliku SWF procesu roboczego.

Parametry

key:String — Nazwa właściwości współużytkowanej, która ma zostać pobrana.

Zwraca
* — Wartość właściwości współużytkowanej zapisana z określonym kluczem lub wartość null, jeśli dla danego klucza nie zapisano żadnej wartości.

removeEventListener

()metoda 
override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Usuwa detektor z obiektu EventDispatcher. Jeśli w obiekcie EventDispatcher nie ma zarejestrowanego zgodnego detektora zdarzeń, wywołanie tej metody nie odnosi żadnego skutku.

Parametry

type:String — Typ zdarzenia.
 
listener:Function — Obiekt detektora przeznaczony do usunięcia.
 
useCapture:Boolean (default = false)Określa, czy detektor był zarejestrowany dla fazy przechwytywania, czy dla faz miejsca docelowego i propagacji. Jeżeli detektor był zarejestrowany zarówno dla fazy przechwytywania, jak i dla fazy miejsca docelowego i propagacji, konieczne są dwa wywołania metody removeEventListener(): jedno wywołanie z parametrem useCapture ustawionym na true, a następne wywołanie z parametrem useCapture ustawionym na false.

setSharedProperty

()metoda 
public function setSharedProperty(key:String, value:*):void

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Udostępnia nazwaną wartość, która jest dostępna dla kodu działającego w pliku SWF procesu roboczego.

Tę metodę można wywołać przed wywołaniem metody start() procesu roboczego. W takiej sytuacji właściwość współużytkowana jest dostępna dla kodu w pliku SWF procesu roboczego podczas wykonywania konstruktora.

Do parametru value można przekazać jako wartość prawie dowolny obiekt. Poza wyjątkami wskazanymi poniżej obiekty przekazywane do parametru value nie są przekazywane przez odniesienie. Zmiany wprowadzone w obiekcie w jednym z procesów roboczych po wywołaniu metody setSharedProperty() nie są przenoszone do innego procesu roboczego. Obiekt jest kopiowany przez serializację do formatu AMF3, a następnie deserializację w postaci nowego obiektu w odbierającym procesie roboczym. Z tego powodu obiektów, które nie umożliwiają serializacji w formacie AMF3 (w tym obiektów ekranowych), nie można przekazać do parametru value. W celu prawidłowego przekazania obiektu klasy własnej definicja tej klasy musi zostać zrejestrowana przy użyciu funkcji flash.net.registerClassAlias() lub metadanych [RemoteClass]. W przypadku obu tych technik należy zastosować taki sam alias dla wersji klas obu procesów roboczych.

Istnieje pięć typów obiektów, które są wyjątkami od reguły dotyczącej braku współużytkowania obiektów między procesami roboczymi:

  • Worker
  • MessageChannel
  • Współużytkowany obiekt ByteArray (obiekt ByteArray, którego właściwość shareable ma wartość true)
  • Mutex
  • Condition

W przypadku przekazania wystąpienia tych obiektów do parametru value każdy proces roboczy zawiera odniesienie do tego samego obiektu podstawowego. Zmiany wprowadzone w wystąpieniu w jednym procesie roboczym są natychmiast dostępne w innych procesach. Ponadto jeżeli to samo wystąpienie tych obiektów zostanie wielokrotnie przekazane przy użyciu metody setSharedProperty(), środowisko wykonawcze nie utworzy nowej kopii obiektu w odbierającym procesie roboczym. Zamiast tego zostanie ponownie użyte to samo odniesienie, co pozwala ograniczyć użycie pamięci systemowej.

Wywołanie tej metody z wartością null lub undefined dla argumentu value powoduje wyczyszczenie wcześniej ustawionej wartości dla określonego argumentu key. Wyczyszczenie wartości w taki sposób powoduje usunięcie odniesienia do niej, co pozwala na usunięcie wartości w procesie oczyszczania pamięci.

Dla argumentu key można użyć dowolnej wartości typu String. Właściwości współużytkowane są dostępne dla każdego kodu, który ma dostęp do procesu roboczego. Aby uniknąć przypadkowego zastąpienia wartości, warto zastosować prefiksy, sufiksy lub inny mechanizm nadawania niepowtarzalnych nazw kluczy.

Parametry

key:String — Nazwa, pod którą została zapisana właściwość współużytkowana.
 
value:* — Wartość właściwości współużytkowanej.

Powiązane elementy interfejsu API

start

()metoda 
public function start():void

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Rozpoczyna wykonywanie procesu roboczego. Środowisko wykonawcze generuje wątek procesu roboczego i wywołuje konstruktor klasy głównej pliku SWF procesu roboczego.

Ta operacja jest asynchroniczna. Po zakończeniu uruchamiania procesu roboczego jego właściwość state zmienia wartość na WorkerState.RUNNING i proces roboczy wywołuje zdarzenie workerState.

terminate

()metoda 
public function terminate():Boolean

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Zatrzymuje wykonywanie kodu procesu roboczego. Wywołanie tej metody przerywa wykonywanie bieżącego kodu ActionScript w pliku SWF procesu roboczego.

Zwraca
Boolean — Wartość true, jeśli wykonywanie kodu w procesie roboczym zostało przerwane, lub false, jeżeli proces roboczy w ogóle nie został uruchomiony.
Szczegół zdarzenia

workerState

Zdarzenie
Typ obiektu zdarzenia: flash.events.Event
właściwość Event.type = flash.events.Event.WORKER_STATE

Wersja języka: ActionScript 3.0
Wersje środowiska wykonawczego: Flash Player 11.4, AIR 3.4

Wywoływane, gdy zmienia się wartość właściwości state procesu roboczego.

Stała Event.WORKER_STATE definiuje wartość właściwości type obiektu zdarzenia workerState.

To zdarzenie ma następujące właściwości:

WłaściwośćWartość
bubblesfalse
cancelablefalse; nie ma domyślnego zachowania, które można byłoby anulować.
currentTargetObiekt przetwarzający aktywnie obiekt Event za pomocą detektora zdarzeń.
targetObiekt, który wywołał to zdarzenie.
WorkerExample.as

W poniższym przykładzie przedstawiono wykonywanie zadania w tle za pomocą obiektu Worker. Przykład obejmuje również komunikację między macierzystym procesem roboczym i procesem roboczym działającym w tle, w tym przekazanie obiektu klasy własnej między procesami roboczymi.

Przykład zawiera trzy klasy ActionScript: WorkerExample jest klasą główną i macierzystym procesem roboczym. BackgroundWorker to klasa wykonująca pracę w tle. Jest ona skompilowana jako klasa główna pliku SWF procesu roboczego działającego w tle. CountResult to klasa własna służąca do przekazywania danych między dwoma procesami roboczymi w postaci pojedynczego obiektu (zamiast wielu wartości).

W tym przykładzie proces roboczy działający w tle odlicza w pętli do liczby określonej przez macierzysty proces roboczy. Wraz z postępami pracy proces ten wysyła odpowiednie komunikaty do macierzystego procesu roboczego. Po zakończeniu liczenia proces roboczy działający w tle wysyła do macierzystego procesu roboczego komunikat informujący o zakończeniu działania i czasie wykonania operacji.

WorkerExample to klasa główna pliku SWF, zatem jest również klasą główną pierwotnego procesu roboczego. W metodzie initialize() kod generuje obiekt procesu roboczego działającego w tle na podstawie bajtów klasy BackgroundWorker osadzonych za pomocą znacznika [Embed].

Po utworzeniu procesu roboczego działającego w tle przez wywołanie metody WorkerDomain.createWorker() kod konfiguruje komunikację między procesami roboczymi. Najpierw tworzony jest zestaw obiektów MessageChannel. Obiekty są przekazywane do procesu roboczego działającego w tle przez wywołanie metody setSharedProperty(). Następnie kod rejestruje zdarzenie workerState dla obiektu Worker działającego w tle i uruchamia proces roboczy, wywołując jego metodę start().

Wraz z postępami pracy proces roboczy działający w tle wysyła odpowiednie komunikaty (a na końcu wyniki) do macierzystego procesu roboczego. Na podstawie tych informacji macierzysty proces roboczy aktualizuje pasek postępu i wskaźnik tekstowy.

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;
        }
    }
}
WorkerExample.BackgroundWorker.as

Ta klasa zawiera kod procesu roboczego działającego w tle. Ta klasa jest kompilowana do oddzielnego pliku SWF. Ten plik SWF jest następnie osadzany w głównym pliku SWF.

W przypadku metody initialize() proces roboczy odbiera obiekty MessageChannel przekazane przez macierzysty proces roboczy. Obiekty te służą do komunikacji między procesami roboczymi.

Macierzysty proces roboczy wywołuje metodę send() w kanale komunikatów commandChannel, aby wysłać komunikat. Następnie środowisko wykonawcze wywołuje w procesie roboczym działającym w tle zdarzenie channelMessage, wywołując metodę handleCommandMessage().

Operacje procesu roboczego działającego w tle są realizowane w metodzie count(). Gdy proces roboczy działający w tle kontynuuje liczenie, wysyła komunikaty o postępach do macierzystego procesu roboczego, wywołując metodę send() obiektu progressChannel klasy MessageChannel. Po zakończeniu liczenia wywołuje metodę send() obiektu resultChannel klasy MessageChannel.

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");
        }
    }
}
WorkerExample.CountResult.as

Ta klasa definiuje obiekt wartości klasy CountResult. Jest to klasa własna przekazywana między procesami roboczymi. W celu przekazania klasy własnej każdy proces roboczy wywołuje metodę registerClassAlias() przy użyciu tej samej nazwy aliasu.
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;
    }
}
IOSWorkerExample.as

Od wersji 19 środowiska AIR wprowadzono obsługę współbieżności w systemie iOS. Aplikacje działają zgodnie z wersjami Flash/AIR for Android, ale występują różnice dotyczące wczytywania plików SWF oraz przekazywania tablic bajtowych do procesów roboczych.

1. Nie działa dynamiczne wczytywanie zdalnego pliku SWF z kodem ActionScript, dlatego zdalne pliki SWF należy przekazywać do procesów roboczych jako uproszczone pliki SWF. 2. Osadzanie plików SWF (z kodem ABC) przy użyciu znacznika [Embed] nie działa w systemie iOS. Każdy dodatkowy proces roboczy jest tworzony z oddzielnego pliku SWF. Aby utworzyć nowe wystąpienie klasy Worker, należy przekazać obiekt ByteArray z bajtami pliku SWF procesu roboczego działającego w tle jako argument metody createWorker() klasy WorkerDomain.

Istnieją dwie typowe metody uzyskiwania dostępu do bajtów pliku SWF na te potrzeby w systemie iOS: Pierwsza z nich to użycie obiektu Loader, a druga — obiektu URLLoader.

W poniższym przykładzie plik SWF jest wczytywany przy użyciu interfejsu API Loader.

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();
            }
        }
        
    }
}
IOSBackWorker.as

Ten kod jest wykonywany przy wywołaniu funkcji wczytywania obiektu Loader, dlatego proces roboczy tła musi zawierać test właściwości isPrimordial (zawarty w przykładzie).
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++;
                }            
            }
        }        
    }
}




[ X ]Dlaczego język angielski?
Treść dokumentacji języka ActionScript 3.0 wyświetlana w języku angielskim

Niektóre części dokumentacji języka ActionScript 3.0 nie są przetłumaczone na poszczególne języki. Gdy element nie jest przetłumaczony na dany język, jest wyświetlany tekst angielski. Na przykład opis klasy ga.controls.HelpBox nie jest przetłumaczony na żaden dodatkowy język. Z tego powodu polska wersja dokumentacji zawiera opis klasy ga.controls.HelpBox w języku angielskim.