Guida di riferimento di ActionScript® 3.0 per la piattaforma Adobe® Flash®
Home  |  Nascondi elenco pacchetti e classi |  Pacchetti  |  Classi  |  Novità  |  Indice  |  Appendici  |  Perché in inglese?
Filtri: AIR 30.0 e versioni precedenti, Flash Player 30.0 e versioni precedenti, Flash Lite 4
Flex 4.6 e versioni precedenti, Flash Pro CS6 e versioni precedenti
Nascondi filtri
flash.system 

Worker  - AS3

Pacchettix

Primo livello
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

Elementi del linguaggio

Costanti globali
Funzioni globali
Operatori
Istruzioni, parole chiave e direttive
Tipi speciali

Appendici

Novità
Errori del compilatore
Avvisi del compilatore
Errori runtime
Migrazione a ActionScript 3
Set di caratteri supportati
Tag solo di MXML
Elementi XML di Motion
Tag Timed Text
Elenco degli elementi obsoleti
Costanti di implementazione dell’accessibilità
Utilizzare gli esempi ActionScript
Note legali
Pacchettoflash.system
Classepublic final class Worker
EreditarietàWorker Inheritance EventDispatcher Inheritance Object

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Un oggetto Worker rappresenta un worker, che è un’istanza virtuale del runtime Flash. Ogni istanza Worker fornisce il controllo e l’accesso al ciclo di vita e ai dati condivisi di un singolo worker.

Un worker permette di eseguire il codice "sullo sfondo" (in background), simultaneamente alle altre operazioni in corso di esecuzione in un altro worker (compreso il worker del file SWF principale). In un contesto che non prevede l’uso dei worker, alcune operazioni, ad esempio l’elaborazione di un set di dati di grandi dimensioni in una ripetizione ciclica, possono richiedere talmente tanto tempo da impedire al thread dell’applicazione principale di aggiornare lo schermo abbastanza rapidamente. Ciò può causare una visualizzazione a scatti o un blocco dell’immagine sullo schermo.

L’uso di un worker permette di eseguire un’operazione molto lunga o lenta in background. Ogni worker esegue il proprio codice in un thread di esecuzione separato dagli altri worker. Un worker il cui codice richiede tempi di esecuzione molto lunghi non impedisce l’esecuzione del codice di un altro worker. Al contrario, i due set di codice vengono eseguiti in parallelo. Di conseguenza, un worker può essere utilizzato per eseguire codice in background mentre il thread dell’applicazione principale rimane libero e può continuare ad aggiornare normalmente lo schermo.

Questa capacità di eseguire simultaneamente più set di istruzioni di codice viene definita contemporaneità di esecuzione (in inglese, "concurrency").

Nota: l’uso dei worker per la contemporaneità di esecuzione è supportato in Flash Player e in AIR sulle piattaforme desktop. Per le piattaforme mobili, la contemporaneità di esecuzione è supportata in AIR su Android e iOS. Potete usare la proprietà statica isSupported per verificare se la contemporaneità di esecuzione è supportata prima di utilizzarla.

Non è possibile creare istanze Worker direttamente chiamando la funzione di costruzione Worker(). Nei contesti che supportano l’uso dei worker per la contemporaneità di esecuzione, all’avvio il runtime crea automaticamente il Worker associato al file SWF principale, denominato worker primordiale.

Ogni worker aggiuntivo viene creato da un SWF separato. Per creare una nuova istanza della classe Worker, passate un ByteArray con i byte del file SWF del worker di background come argomento al metodo createWorker() della classe WorkerDomain. Sono possibili tre modi diversi per accedere ai byte di un file SWF a questo scopo:

  • Usare il metatag [Embed] per incorporare il file .swf nell’applicazione come 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();
     }
  • Caricare un file SWF esterno mediante un 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();
     }
  • Usare un singolo SWF sia come worker primordiale che come worker di background:

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

I worker vengono eseguiti separatamente l’uno dall’altro e non hanno accesso agli stessi elementi (memoria, variabili e codice). Tuttavia, sono disponibili tre meccanismi per passare messaggi e dati tra istanze Worker differenti:

  • Proprietà condivise: ogni worker ha un set interno di valori con nome che possono essere impostati e letti sia dall’interno del worker stesso che da altri worker. Potete impostare un valore usando il metodo setSharedProperty() e leggere un valore con il metodo getSharedProperty().
  • MessageChannel: un oggetto MessageChannel consente di inviare messaggi e dati da un worker a un altro su un canale a una sola via. Il codice del worker destinatario può restare in ascolto di un evento per essere notificato quando arriva un messaggio. Per creare un oggetto MessageChannel, utilizzate il metodo createMessageChannel().
  • ByteArray condivisibile: se la proprietà shareable di un oggetto ByteArray è true, la stessa la memoria sottostante viene utilizzata per le istanze di quel ByteArray in tutti i worker. Poiché il codice di più worker può accedere alla memoria condivisa contemporaneamente, il vostro codice deve utilizzare i meccanismi descritti nella descrizione della proprietà ByteArray.shareable in modo da evitare problemi dovuti a modifiche impreviste dei dati.

Varie API del runtime non sono disponibili nel codice eseguito in un worker di background. Si tratta principalmente di API relative ai meccanismi di input e output dell’utente o a elementi del sistema operativo come la gestione delle finestre e del trascinamento. In generale, per qualsiasi API che non è supportata in tutti i contesti, utilizzate le proprietà isSupported, available e simili per verificare se l’API è disponibile nel contesto del worker di background prima di tentare di utilizzarla.

Nota: le estensioni native non sono supportate per i worker di background e secondari.

I worker sono utili perché limitano il rischio di riduzione della frequenza fotogrammi causata dal blocco del thread di rendering principale da parte di un altro codice. Tuttavia, i worker richiedono memoria aggiuntiva e risorse della CPU e possono di conseguenza avere un impatto sulle prestazioni generali dell’applicazione. Poiché ogni worker utilizza una propria istanza dalla macchina virtuale del runtime, anche il carico di lavoro di un worker di poca importanza può essere notevole. Quando usate i worker, provate il codice su tutte le piattaforme di destinazione per assicurarvi che il suo consumo delle risorse di sistema non sia eccessivo. Adobe consiglia di non utilizzare più di uno o due worker di background in uno scenario tipico.

Vedere gli esempi

Altri esempi

Altre informazioni

Elementi API correlati



Proprietà pubbliche
 ProprietàDefinito da
 Inheritedconstructor : Object
Un riferimento all'oggetto classe o alla funzione di costruzione per una determinata istanza di oggetto.
Object
  current : Worker
[statico] [sola lettura] Fornisce accesso al worker che contiene il codice corrente.
Worker
  isPrimordial : Boolean
[sola lettura] Indica se questo worker è il worker primordiale.
Worker
  isSupported : Boolean
[statico] [sola lettura] Indica se il contesto runtime corrente supporta l’uso degli oggetti Worker per l’esecuzione contemporanea del codice.
Worker
  state : String
[sola lettura] Lo stato corrente dell’oggetto worker nel suo ciclo di vita.
Worker
Metodi pubblici
 MetodoDefinito da
  
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
[override] Registra un oggetto listener di eventi con un oggetto EventDispatcher, in modo che il listener riceva la notifica di un evento.
Worker
  
Crea una nuova istanza MessageChannel per inviare messaggi dal worker sul quale il metodo viene chiamato a un altro worker destinatario.
Worker
 Inherited
Invia un evento nel flusso di eventi.
EventDispatcher
  
Recupera un valore memorizzato in questo worker con una chiave con nome.
Worker
 Inherited
Verifica se per l'oggetto EventDispatcher sono presenti listener registrati per un tipo specifico di evento.
EventDispatcher
 Inherited
Indica se per un oggetto è definita una proprietà specifica.
Object
 Inherited
Indica se un'istanza della classe Object si trova nella catena di prototipi dell'oggetto specificato come parametro.
Object
 Inherited
Indica se la proprietà specificata esiste ed è enumerabile.
Object
  
removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
[override] Rimuove un listener dall'oggetto EventDispatcher.
Worker
 Inherited
Imposta la disponibilità di una proprietà dinamica per le operazioni cicliche.
Object
  
Fornisce un valore con nome che è disponibile al codice eseguito nell’SWF del worker.
Worker
  
Avvia l’esecuzione del worker.
Worker
  
Interrompe l’esecuzione del codice di questo worker.
Worker
 Inherited
Restituisce la rappresentazione in formato stringa di questo oggetto, formattato in base alle convenzioni specifiche per le versioni localizzate.
Object
 Inherited
Restituisce la rappresentazione in formato stringa dell'oggetto specificato.
Object
 Inherited
Restituisce il valore di base dell'oggetto specificato.
Object
 Inherited
Verifica se un listener di eventi è registrato con questo oggetto EventDispatcher o qualsiasi suo antenato per il tipo di evento specificato.
EventDispatcher
Eventi
 Evento Riepilogo Definito da
 Inherited[evento di trasmissione] Inviato quando Flash Player o l'applicazione AIR ottiene lo stato di attivazione del sistema operativo ed entra nello stato attivo.EventDispatcher
 Inherited[evento di trasmissione] Inviato quando Flash Player o l'applicazione AIR perde l'attivazione del sistema operativo e sta entrando nello stato inattivo.EventDispatcher
  Inviato quando cambia il valore della proprietà state del worker.Worker
Descrizione delle proprietà

current

proprietà
current:Worker  [sola lettura]

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Fornisce accesso al worker che contiene il codice corrente.



Implementazione
    public static function get current():Worker

isPrimordial

proprietà 
isPrimordial:Boolean  [sola lettura]

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Indica se questo worker è il worker primordiale.

Il worker primordiale è il worker in cui viene eseguito l’SWF iniziale. Questo worker controlla il rendering sullo schermo.

Questa proprietà può essere utilizzata per realizzare un’applicazione in cui il worker primordiale e quello di background sono due istanze dello stesso file SWF. L’alternative è quella di strutturare il codice in modo tale che il worker di background utilizzi un codice differente compilato in un SWF diverso rispetto al worker primordiale.



Implementazione
    public function get isPrimordial():Boolean

isSupported

proprietà 
isSupported:Boolean  [sola lettura]

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Indica se il contesto runtime corrente supporta l’uso degli oggetti Worker per l’esecuzione contemporanea del codice.

Se la contemporaneità di esecuzione è disponibile, il valore di questa proprietà + true.



Implementazione
    public static function get isSupported():Boolean

state

proprietà 
state:String  [sola lettura]

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Lo stato corrente dell’oggetto worker nel suo ciclo di vita. I valori possibili per questa proprietà sono definiti nella classe WorkerState.



Implementazione
    public function get state():String

Elementi API correlati

Descrizione dei metodi

addEventListener

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

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Registra un oggetto listener di eventi con un oggetto EventDispatcher, in modo che il listener riceva la notifica di un evento. Potete registrare listener di eventi in tutti i nodi dell'elenco di visualizzazione per un tipo di evento, una fase e una priorità specifiche.

Una volta registrato un listener di eventi, non potete modificarne la priorità mediante chiamate aggiuntive a addEventListener(). Per modificare la priorità di un listener dovete chiamare innanzitutto removeListener(). In seguito potete registrare nuovamente il listener con il nuovo livello di priorità.

Tenete presente che, dopo la registrazione del listener, le successive chiamate a addEventListener() con un valore type o useCapture diverso determinano la creazione di un'altra registrazione per il listener. Ad esempio, se registrate un listener inizialmente con useCapture impostato su true, l'intercettazione avviene solo durante la fase di cattura. Se chiamate di nuovo addEventListener() utilizzando lo stesso oggetto listener ma impostando useCapture su false, ottenete due listener separati: uno rileva gli eventi durante la fase di cattura e l'altro durante la fasi target e di bubbling.

Non potete registrare un listener di eventi solo per la fase target o per la fase di bubbling. Queste fasi vengono accoppiate durante la registrazione perché la propagazione è valida solo per gli antenati del nodo target.

Se il listener di eventi non è più necessario, rimovetelo con una chiamata a removeEventListener() per evitare problemi di memoria. I listener di eventi non vengono eliminati automaticamente dalla memoria perché il garbage collector non rimuove il listener fintantoché esiste l'oggetto che effettua l'invio (a meno che il parametro useWeakReference non sia impostato su true).

Se copiate un'istanza EventDispatcher, i listener di eventi associati all'istanza non vengono copiati (se un nodo appena creato necessita di un listener di eventi, dovete associarlo dopo avere creato il nodo). Se invece spostate un'istanza EventDispatcher, insieme a questa vengono spostati anche i listener di eventi associati.

Se il listener di eventi viene registrato su un nodo mentre questo sta elaborando un evento, il listener di eventi non viene attivato durante la fase corrente ma può esserlo durante una fase successiva del flusso di eventi, ad esempio la fase di bubbling.

Se un listener di eventi viene rimosso da un nodo mentre questo sta elaborando un evento, il listener continua a essere attivato dalle azioni in corso. Dopo che è stato rimosso, il listener di eventi non viene più richiamato (a meno che non venga registrato nuovamente per elaborazioni future).

Parametri

type:String — Il tipo di evento.
 
listener:Function — La funzione listener che elabora l'evento. Questa funzione deve accettare un oggetto Event come unico parametro e non restituire alcun valore, come mostra l'esempio che segue:
function(evt:Event):void

La funzione può avere qualunque nome.

 
useCapture:Boolean (default = false)Determina se il listener funziona nella fase di cattura o nelle fasi target e di bubbling. Se useCapture è impostato su true, il listener elabora l'evento solo durante la fase di cattura e non nella fase target o di bubbling. Se useCapture è impostato su false, il listener elabora l'evento solo durante la fase target o di bubbling. Per consentire l'intercettazione dell'evento in tutte e tre le fasi, chiamate due volte addEventListener, una volta con useCapture impostato su true e un'altra volta con useCapture impostato su false.
 
priority:int (default = 0) — Il livello di priorità del listener di eventi. La priorità è indicata da un numero intero a 32 bit con segno. Più alto è il numero, più alta è la priorità. Tutti i listener con priorità n vengono elaborati prima dei listener con priorità n-1. Se due o più listener hanno la stessa priorità, l'elaborazione avviene secondo l'ordine in cui sono stati aggiunti. La priorità predefinita è 0.
 
useWeakReference:Boolean (default = false) — Determina se il riferimento al listener è forte o debole. Un riferimento forte (predefinito) evita che il listener venga sottoposto al processo di garbage collection, un riferimento debole no.

Le funzioni dei membri a livello di classe non sono soggette a garbage collection, pertanto è possibile impostare useWeakReference su true. Se impostate useWeakReference su true per un listener che è una funzione nidificata, la funzione viene sottoposta a garbage collection e non è più persistente. Se create riferimenti alla funzione nidificata (salvandola in un'altra variabile), questa non viene sottoposta a garbage collection e rimane persistente.

createMessageChannel

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

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Crea una nuova istanza MessageChannel per inviare messaggi dal worker sul quale il metodo viene chiamato a un altro worker destinatario. Il codice del worker che crea l’oggetto MessageChannel può utilizzarlo per inviare messaggi a una sola via all’oggetto Worker specificato nell’argomento receiver.

Anche se un’istanza MessageChannel può essere utilizzata per inviare messaggi e dati da un’istanza Worker a un’altra, almeno un’istanza MessageChannel deve essere passata a un Worker di livello inferiore come proprietà condivisa, chiamando il metodo setSharedProperty() dell’oggetto 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);

Parametri

receiver:Worker — Il worker che riceverà i messaggi trasmessi dal canale di messaggio creato.

Restituisce
MessageChannel — L’oggetto MessageChannel creato dall’operazione.

getSharedProperty

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

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Recupera un valore memorizzato in questo worker con una chiave con nome.

Il codice di un worker di livello inferiore può chiamare questo metodo per recuperare un valore già nella funzione di costruzione della classe principale dell’SWF del worker.

Parametri

key:String — Il nome della proprietà condivisa da recuperare.

Restituisce
* — Il valore della proprietà condivisa memorizzato con la chiave specificata, oppure null se non è memorizzato alcun valore per la chiave specificata.

removeEventListener

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

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Rimuove un listener dall'oggetto EventDispatcher. Se non esiste un listener corrispondente registrato nell'oggetto EventDispatcher, la chiamata a questo metodo non ha alcun effetto.

Parametri

type:String — Il tipo di evento.
 
listener:Function — L'oggetto listener da rimuovere.
 
useCapture:Boolean (default = false)Specifica se il listener è stato registrato per la fase di cattura o per le fasi target e di bubbling. Se il listener è stato registrato sia per la fase di cattura che per quelle target e di bubbling, per eliminarle entrambe sono necessarie due chiamate a removeEventListener(), una con useCapture() impostato su true e un'altra con useCapture() impostato su false.

setSharedProperty

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

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Fornisce un valore con nome che è disponibile al codice eseguito nell’SWF del worker.

Potete chiamare questo metodo prima di chiamare il metodo start() del worker. In tal caso, la proprietà condivisa è disponibile al codice dell’SWF del worker in fase di costruzione.

Il valore passato al parametro value può essere quasi qualsiasi oggetto. Salvo le eccezioni indicate di seguito, qualunque oggetto passato al parametro value non viene passato mediante un riferimento. Le modifiche apportate all’oggetto in un worker dopo la chiamata setSharedProperty() non vengono applicate all’altro worker. L’oggetto viene copiato serializzandolo in formato AMF3 e deserializzandolo in un nuovo oggetto nel worker destinatario. Per questo motivo, qualsiasi oggetto che non può essere serializzato nel formato AMF3, compresi gli oggetti di visualizzazione, non può essere passato al parametro value. Affinché una classe personalizzata possa essere passata correttamente, la definizione della classe deve essere registrata utilizzando la funzione flash.net.registerClassAlias() o il metadato [RemoteClass]. In ambedue i casi occorre utilizzare lo stesso alias per entrambe le versioni della classe destinate ai due worker.

Cinque tipi di oggetti rappresentano eccezioni alla regola che prevede che gli oggetti non possano essere condivisi tra i worker:

  • Il worker 
  • MessageChannel
  • ByteArray condivisibile (un oggetto ByteArray con la proprietà shareable impostata su true).
  • Mutex
  • Condition

Se si passa un’istanza di questi oggetti al parametro value, ogni worker ha un riferimento allo stesso oggetto sottostante. Le modifiche apportate a un’istanza in un worker sono immediatamente disponibili negli altri worker. Inoltre, se passate la stessa istanza di questi oggetti più di una volta utilizzando setSharedProperty(), il runtime non crea una nuova copia dell’oggetto nel worker destinatario. Viene invece riutilizzato lo stesso riferimento, riducendo così il consumo di memoria.

Se si chiama questo metodo con null o undefined per l’argomento value, viene cancellato qualsiasi valore precedentemente impostato per l’argomento key specificato. La cancellazione di un valore eseguita in questo modo rimuove il riferimento al valore, rendendolo disponibile per il processo di garbage collection.

Potete usare qualsiasi valore String nell’argomento key. Queste proprietà condivise sono disponibili a qualsiasi codice che ha accesso al worker. Per evitare di sovrascrivere un valore involontariamente, valutate l’uso di un prefisso, un suffisso o un meccanismo simile per tentare di rendere univoci i nomi delle chiavi.

Parametri

key:String — Il nome con il quale è memorizzata la proprietà condivisa.
 
value:* — Il valore della proprietà condivisa.

Elementi API correlati

start

()metodo 
public function start():void

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Avvia l’esecuzione del worker. Il runtime crea il thread del worker e chiama la funzione di costruzione della classe principale dell’SWF del worker.

L’operazione è asincrona. Una volta che l’avvio del worker è completo, il worker cambia la propria proprietà state in WorkerState.RUNNING e invia un evento workerState.

terminate

()metodo 
public function terminate():Boolean

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Interrompe l’esecuzione del codice di questo worker. Una chiamata di questo metodo interrompe il codice ActionScript eventualmente in esecuzione nell’SWF del worker.

Restituisce
Booleantrue se il codice del worker era in esecuzione ed è stato interrotto, oppure false se il worker non era stato avviato.
Descrizione degli eventi

workerState

Evento
Tipo di oggetto evento: flash.events.Event
proprietà Event.type = flash.events.Event.WORKER_STATE

Versione linguaggio: ActionScript 3.0
Versioni runtime: Flash Player 11.4, AIR 3.4

Inviato quando cambia il valore della proprietà state del worker.

La costante Event.WORKER_STATE definisce il valore della proprietà type di un oggetto evento workerState.

Questo evento ha le seguenti proprietà:

ProprietàValore
bubblesfalse
cancelablefalse; non è presente alcun comportamento predefinito da annullare.
currentTargetL'oggetto che elabora attivamente l'oggetto Event con un listener di eventi.
targetL'oggetto che ha inviato l'evento.
WorkerExample.as

L’esempio seguente illustra l’uso di un oggetto Worker per eseguire un’operazione in background. Inoltre, mostra come avviene la comunicazione tra il worker principale e il worker di background, compreso il passaggio di un oggetto di classe personalizzato tra i due worker.

L’esempio consiste di tre classi ActionScript: WorkerExample è la classe principale e il worker di livello superiore. BackgroundWorker è la classe che esegue il lavoro di background. È compilata come classe principale dell’SWF del worker di background. CountResult è una classe personalizzata che viene utilizzata per passare dati tra i due worker come oggetto singolo anziché con valori multipli.

In questo esempio, il worker di background esegue un conteggio in una ripetizione ciclica fino al numero specificato dal worker principale. Man mano che procede nell’esecuzione di questa operazione, invia messaggi di avanzamento al worker principale. Infine, quando il conteggio giunge al termine, il worker di background invia un messaggio al worker principale per notificare il completamento dell’operazione e il tempo totale trascorso.

La classe WorkerExample è la classe principale dell’SWF, quindi è anche la classe principale del worker primordiale. Nel metodo initialize(), il codice crea l’oggetto worker di background utilizzando i byte della classe BackgroundWorker, che sono incorporati in un tag [Embed].

Dopo aver creato il worker di background chiamando WorkerDomain.createWorker(), il codice abilita la comunicazione tra i worker. Innanzi tutto il codice crea un set di oggetti MessageChannel. Quindi li passa al worker di background chiamando il metodo setSharedProperty(). Infine esegue la registrazione per l’evento workerState dell’oggetto Worker di background e avvia il worker chiamandone il metodo start().

Man mano che procede nell’esecuzione dell’operazione, il worker di background invia messaggi di avanzamento (e infine di completamento) al worker principale. Quest’ultimo usa le informazioni ricevute per aggiornare la barra di avanzamento e l’indicatore di testo.

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

Questa classe contiene il codice per il worker di background. Viene compilata nel proprio file SWF, che viene quindi incorporato nell’SWF principale.

Nel metodo initialize(), riceve gli oggetti MessageChannel passati dal worker principale. Questi oggetti vengono utilizzati per la comunicazione tra i due worker.

Il worker principale chiama il metodo send() sul canale di messaggio commandChannel per inviare un messaggio. Nel worker di background, il runtime quindi invia l’evento channelMessage chiamando il metodo handleCommandMessage().

Il lavoro vero e proprio del worker di background ha luogo nel metodo count(). Man mano che il worker di background procede nel conteggio, invia messaggi di avanzamento al worker principale chiamando il metodo send() sull’oggetto MessageChannel progressChannel. Quando termina il conteggio, il worker chiama il metodo send() sull’oggetto MessageChannel resultChannel.

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

Questa classe definisce l’oggetto valore CountResult. Questa è una classe personalizzata che viene passata tra i due worker. Per passare una classe personalizzata tra i worker, ogni worker chiama il metodo registerClassAlias() utilizzando lo stesso nome di alias.
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

Il supporto per la contemporaneità di esecuzione per iOS è stato aggiunto da AIR versione 19 e successive. Tutto resta coerente con Flash/AIR Android, tranne per alcune differenze nel caricamento di SWF e nel passaggio di array di byte al worker.

1. Poiché il caricamento dinamico di un file SWF remoto contenente il codice ActionScript non funziona, è necessario passare il file SWF remoto al worker come SWF stripped. 2. L’incorporamento di SWF (con codice ABC) mediante tag [Embed] non funzionerà in iOS. Ogni worker aggiuntivo viene creato da un SWF separato. Per creare una nuova istanza della classe Worker, passate un ByteArray con i byte del file SWF del worker di background come argomento al metodo createWorker() della classe di WorkerDomain.

Esistono due metodi comuni per accedere ai byte di un SWF a questo scopo su iOS: il primo modo è quello di utilizzare Loader per caricare un file SWF esterno e il secondo è utilizzare URLLoader per caricare il file SWF.

L’esempio seguente utilizza l’API Loader per caricare il file SWF.

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

Poiché il codice viene eseguito durante la chiamata della funzione di caricamento di Loader, è necessario un controllo di proprietà isPrimordial nel worker di background, come mostrato nell’esempio.
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 ]Perché in inglese?
Il contenuto della Guida di riferimento di ActionScript 3.0 appare in inglese

Non tutte le parti della Guida di riferimento di ActionScript 3.0 sono tradotte in tutte le lingue. Quando un elemento del linguaggio non è tradotto, viene riportato in inglese. Ad esempio, la classe ga.controls.HelpBox non è tradotta in nessuna lingua. Pertanto, nella versione italiana della guida di riferimento, la descrizione della classe ga.controls.HelpBox è riportata in inglese.