Pakket | flash.system |
Klasse | public final class MessageChannel |
Overerving | MessageChannel EventDispatcher Object |
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Elk MessagChannel bevat een wachtrij met berichtobjecten die van de verzendende worker naar de ontvangende worker worden verzonden. Bij elke aanroep naar send()
wordt een object aan de wachtrij toegevoegd. Bij elke aanroep naar receive()
wordt het oudste berichtobject uit de wachtrij opgehaald.
U kunt niet rechtstreeks MessageChannel-instanties maken door de WorkerChannel()
-constructor aan te roepen. Als u een MessageChannel-instantie wilt maken, roept u de methode createMessageChannel()
aan van het Worker-object dat de berichten via het kanaal gaat verzenden. Hierbij geeft u het ontvangende Worker-object door als argument.
De typische workflow voor het verzenden van berichten met een MessageChannel-object is als volgt:
-
Roep de methode
createMessageChannel()
van de verzendende worker aan om het berichtkanaal te maken// In the sending worker swf var sendChannel:MessageChannel; sendChannel = Worker.current.createMessageChannel(receivingWorker);
-
Geef het berichtkanaal door aan de andere worker door
Worker.setSharedProperty()
aan te roepen of door het kanaal via een bestaand berichtkanaal te verzendenreceivingWorker.setSharedProperty("incomingChannel", sendChannel);
-
De code in de ontvangende worker registreert een listener met het MessageChannel-object voor de
channelMessage
-gebeurtenis.// In the receiving worker swf var incomingChannel:MessageChannel; incomingChannel = Worker.current.getSharedProperty("incomingChannel"); incomingChannel.addEventListener(Event.CHANNEL_MESSAGE, handleIncomingMessage);
-
De code in de verzendende worker verstuurt een bericht door de methode
send()
aan te roepen// In the sending worker swf sendChannel.send("This is a message");
-
De runtime roept de gebeurtenishandler in de code van de ontvangende worker aan en geeft hiermee aan dat er een bericht is verzonden
// In the receiving worker swf // This method is called when the message channel gets a message private function handleIncomingMessage(event:Event):void { // Do something with the message, as shown in the next code listing }
-
De code in de ontvangende worker roept de methode
receive()
aan om het bericht te ontvangen. Het object dat door dereceive()
-methode wordt geretourneerd, is van hetzelfde gegevenstype als het object dat werd doorgegeven aan desend()
-methode.var message:String = incomingChannel.receive() as String;
Naast de bovenstaande asynchrone workflow kunt u met de methode receive()
een alternatieve workflow gebruiken waarbij de code in de ontvangende worker wordt gepauzeerd totdat een bericht wordt verzonden. Zie de beschrijving van de methode receive()
voor meer informatie.
De MessageChannel-klasse is een van de speciale objecttypen die daadwerkelijk worden gedeeld tussen workers, en niet gekopieerd. Wanneer u een berichtkanaal doorgeeft van één worker naar een andere (door ofwel de methode setSharedProperty()
van het Worker-object aan te roepen, of door een MessageChannel-object te gebruiken), beschikken beide workers over een referentie naar een en hetzelfde MessageChannel-object in het geheugen van de runtime.
Verwante API-elementen
Eigenschap | Gedefinieerd door | ||
---|---|---|---|
constructor : Object
Verwijzing naar het klasseobject of de constructorfunctie van een bepaalde objectinstantie. | Object | ||
messageAvailable : Boolean [alleen-lezen]
Geeft aan of de interne wachtrij van MessageChannel een of meer berichten van de verzendende worker bevat. | MessageChannel | ||
state : String [alleen-lezen]
Hiermee wordt de huidige status van het MessageChannel-object aangeduid (open, wordt gesloten of gesloten). | MessageChannel |
Methode | Gedefinieerd door | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void [overschrijven]
Registreert een gebeurtenislistenerobject bij een object EventDispatcher, zodat de listener een melding van een gebeurtenis ontvangt. | MessageChannel | ||
Instrueert het huidige MessageChannel om te sluiten zodra alle berichten zijn ontvangen. | MessageChannel | ||
Verzendt een gebeurtenis naar de gebeurtenisstroom. | EventDispatcher | ||
Controleert of het object EventDispatcher listeners heeft geregistreerd voor een specifiek type gebeurtenis. | EventDispatcher | ||
Geeft aan of voor een object een opgegeven eigenschap is gedefinieerd. | Object | ||
Geeft aan of een instantie van de klasse Object zich in de prototypeketen van het object bevindt dat als parameter is opgegeven. | Object | ||
Geeft aan of de opgegeven eigenschap bestaat en kan worden opgesomd. | Object | ||
Hiermee wordt een enkel berichtobject opgehaald uit de wachtrij met berichten die via dit berichtenkanaal worden verzonden. | MessageChannel | ||
[overschrijven]
Verwijdert een listener uit het object EventDispatcher. | MessageChannel | ||
Verstuurt een object van de verzendende worker en voegt dit object toe aan de wachtrij met berichten voor de ontvangende worker. | MessageChannel | ||
Stelt de beschikbaarheid van een dynamische eigenschap voor lusbewerkingen in. | Object | ||
Geeft de tekenreeksweergave van dit object weer, geformatteerd volgens de locatiespecifieke conventies. | Object | ||
[overschrijven]
Retourneert een tekenreeksrepresentatie van het opgegeven object. | MessageChannel | ||
Retourneert de primitieve waarde van het opgegeven object. | Object | ||
Controleert of een gebeurtenislistener is geregistreerd bij dit object EventDispatcher of een van de voorouders voor het opgegeven type gebeurtenis. | EventDispatcher |
Gebeurtenis | Overzicht | Gedefinieerd door | ||
---|---|---|---|---|
[uitgezonden gebeurtenis] Wordt verzonden wanneer Flash Player of de AIR-toepassing de besturingssysteemfocus krijgt en actief wordt. | EventDispatcher | |||
Wordt telkens verzonden wanneer de verzendende worker de methode send() van dit MessageChannel-object aanroept om aan te duiden dat er een nieuw berichtobject beschikbaar is in de wachtrij van de MessageChannel-instantie. | MessageChannel | |||
Wordt verzonden wanneer de waarde van de state-eigenschap van het berichtkanaal wordt gewijzigd. | MessageChannel | |||
[uitgezonden gebeurtenis] Wordt verzonden wanneer Flash Player of de AIR-toepassing de systeemfocus verliest en inactief wordt. | EventDispatcher |
messageAvailable | eigenschap |
state | eigenschap |
state:String
[alleen-lezen] Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Hiermee wordt de huidige status van het MessageChannel-object aangeduid (open, wordt gesloten of gesloten). Mogelijke waarden voor deze eigenschap worden gedefinieerd in de klasse MessageChannelState.
Implementatie
public function get state():String
Verwante API-elementen
addEventListener | () | methode |
override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Registreert een gebeurtenislistenerobject bij een object EventDispatcher, zodat de listener een melding van een gebeurtenis ontvangt. U kunt gebeurtenislisteners registreren op alle knooppunten in het weergaveoverzicht van een specifiek type gebeurtenis, fase of prioriteit.
Nadat het registreren van een gebeurtenislistener is voltooid, kunt u de prioriteit ervan niet wijzigen door extra aanroepen van addEventListener()
. Wanneer u de prioriteit van een listener wilt wijzigen, moet u eerst removeListener()
aanroepen. U kunt de listener opnieuw registreren met het nieuwe prioriteitsniveau.
Nadat de listener is geregistreerd, resulteren volgende aanroepen van addEventListener()
met een andere waarde voor type
of useCapture
in het maken van een afzonderlijke listenerregistratie. Wanneer u bijvoorbeeld eerst een listener registreert bij useCapture
ingesteld op true
, luistert deze alleen tijdens de vastlegfase. Wanneer u addEventListener()
opnieuw aanroept met hetzelfde listenerobject maar met useCapture
ingesteld op false
, hebt u twee afzonderlijke listeners: één die tijdens de vastlegfase luistert en één die tijdens de doel- en terugkoppelfasen luistert.
U kunt geen gebeurtenislistener registeren voor alleen de doel- of terugkoppelfase. Deze fasen worden bij de registratie gekoppeld, omdat terugkoppeling alleen van toepassing is op voorouders van het doelknooppunt.
Wanneer u een gebeurtenislistener niet langer nodig hebt, kunt u deze verwijderen door removeEventListener()
aan te roepen; anders kan dit resulteren in geheugenproblemen. Gebeurtenisluisteraars worden niet automatisch uit het geheugen verwijderd, omdat de verzamelaar met ongewenste details de luisteraar niet verwijderd zolang het verzendende object bestaat (behalve als de parameter useWeakReference
op true
is ingesteld).
Het kopiëren van een instantie EventDispatcher kopieert de daaraan gekoppelde gebeurtenislisteners. (Wanneer uw nieuwe knooppunt een gebeurtenislistener nodig heeft, moet u de listener eraan koppelen na het maken van het knooppunt.) Wanneer u echter een instantie EventDispatcher verplaatst, worden de daaraan gekoppelde listeners mee verplaatst.
Wanneer de gebeurtenislistener wordt geregistreerd op een knooppunt terwijl een gebeurtenis op dit knooppunt wordt verwerkt, wordt de gebeurtenislistener niet geactiveerd tijdens de huidige fase maar kan wel worden geactiveerd in een latere fase in de gebeurtenisstroom, zoals de terugkoppelfase.
Wanneer een gebeurtenislistener wordt verwijderd uit een knooppunt terwijl een gebeurtenis wordt verwerkt op het knooppunt, wordt deze nog steeds geactiveerd door de huidige handelingen. Nadat deze is verwijderd, wordt de gebeurtenislistener niet meer aangeroepen (tenzij deze opnieuw wordt geregistreerd voor toekomstige verwerking).
Parameters
type:String — Het type gebeurtenis.
| |
listener:Function — De listenerfunctie die de gebeurtenis verwerkt. Deze functie moet een Event-object accepteren als de enige parameter en niets retourneren, zoals in dit voorbeeld wordt getoond:
function(evt:Event):void De functie kan elke naam hebben. | |
useCapture:Boolean (default = false ) —
Bepaalt of de listener werkt in de vastleg-, doel- en terugkoppelfase. Wanneer useCapture wordt ingesteld op true , verwerkt de listener de gebeurtenis alleen tijdens de vastlegfase en niet tijdens de doel- of terugkoppelfase. Wanneer useCapture wordt ingesteld op false , verwerkt de listener de gebeurtenis alleen tijdens de doel- of terugkoppelfase. Wanneer u in alle drie de fasen naar de gebeurtenis wilt luisteren, roept u addEvenListener() tweemaal aan, één keer met useCapture ingesteld op true en één keer met useCapture ingesteld op false .
| |
priority:int (default = 0 ) — Het prioriteitsniveau van de gebeurtenislistener. De prioriteit is opgegeven door een 32-bits geheel getal. Hoe hoger het getal, hoe hoger de prioriteit. Alle listeners met een prioriteit n worden verwerkt voor listeners met een prioriteit n -1. Wanneer twee of meer listeners dezelfde prioriteit hebben, worden ze verwerkt in de volgorde waarin ze werden toegevoegd. De standaardprioriteit is 0.
| |
useWeakReference:Boolean (default = false ) — Bepaalt of de verwijzing van de listener sterk of zwak is. Een sterke verwijzing (standaard) voorkomt dat uw listener wordt opgeschoond. Een zwakke verwijzing doet dat niet. Lidfuncties op klasseniveau worden niet opgeschoond. U kunt dus |
close | () | methode |
public function close():void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Instrueert het huidige MessageChannel om te sluiten zodra alle berichten zijn ontvangen.
Zodra u deze methode aanroept, kunt u de methode send()
niet meer aanroepen om berichten toe te voegen aan de wachtrij. Als u send()
toch aanroept, mislukt de aanroep en wordt de waarde false
geretourneerd.
U kunt ook alleen de methode receive()
aanroepen om berichten te ontvangen die al in de wachtrij zijn geplaatst. Als de wachtrij leeg is, retourneert de receive()
-aanroep de waarde null
.
Gebeurtenissen
channelState: — verzonden wanneer de methode close() wordt aangeroepen (en waarmee de state -eigenschap wordt ingesteld op MessageChannelState.CLOSING ). Nogmaals verzonden wanneer alle berichten zijn ontvangen en de state -eigenschap wordt ingesteld op MessageChannelState.CLOSED .
|
receive | () | methode |
public function receive(blockUntilReceived:Boolean = false):*
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Hiermee wordt een enkel berichtobject opgehaald uit de wachtrij met berichten die via dit berichtenkanaal worden verzonden.
Telkens wanneer de methode send()
van het MessageChannel-object wordt aangeroepen door de code van de verzendende worker, wordt een enkel object toegevoegd aan de interne wachtrij van het berichtkanaal. Deze objecten worden in de wachtrij geplaatst, totdat ze achtereenvolgens worden opgehaald door de verzendende worker die de methode receive()
aanroept. De berichtobjecten worden ontvangen in de volgorde waarin ze zijn verzonden.
Als u wilt controleren of de wachtrij een berichtobject bevat dat kan worden ontvangen, gebruikt u de eigenschap messageAvailable
.
Normaal gesproken wordt het object dat aan de methode send()
wordt via serienummering doorgegeven in de AMF3-indeling. Wanneer het object uit de wachtrij wordt gehaald door de receive()
-aanroep, wordt het object via serienummering omgezet in een ActionScript-object (een kopie van het oorspronkelijke object) in de ontvangende worker en ontvangt de worker een referentie naar die kopie. Sommige objecttypen worden gedeeld tussen workers, en niet gekopieerd. In dat geval is het object dat de ontvangende worker krijgt, een referentie naar het gedeelde object en geen kopie ervan. Zie de beschrijving van de methode send()
voor meer informatie hierover.
Het gedrag van de methode verandert als de wachtrij leeg is en u de waarde true
doorgeeft voor de blockUntilReceived
-parameter. In dat geval pauzeert de worker de bijbehorende uitvoeringsthread bij de receive()
-aanroep en wordt er geen code meer uitgevoerd. Zodra de verzendende worker send()
aanroept, wordt de receive()
-aanroep voltooid doordat het bericht wordt ontvangen. Hierna vervolgt de worker de uitvoering met de code die volgt op de receive-aanroep.
Parameters
blockUntilReceived:Boolean (default = false ) — geeft aan of de uitvoeringsthread van de worker een berichtobject moet ontvangen waarna de uitvoering wordt voortgezet (false ), of dat de thread moet pauzeren bij de receive() -aanroep en wachten op een bericht dat wordt verzonden wanneer de wachtrij leeg is (true )
|
* — een kopie van het object dat wordt doorgegeven aan de methode send() door de verzendende worker. Als het object een van de speciale objecttypen is die daadwerkelijk worden gedeeld tussen workers, is de geretourneerde waarde een referentie naar het gedeelde object en geen kopie ervan. Als er geen bericht beschikbaar is in de wachtrij, wordt de waarde null geretourneerd door de methode.
|
Gegenereerde uitzondering
IOError — als het kanaal wordt gesloten op het tijdstip dat de methode wordt aangeroepen, of als het argument blockUntilReceived leidt tot het pauzeren van de uitvoering en het kanaal vervolgens wordt gesloten door een andere worker.
| |
ArgumentError — als de aanroepende code zich niet in de ontvangende worker bevindt
| |
ScriptTimeoutError — als de methode wordt aangeroepen door code in de 'primordial worker' in Flash Player en het argument blockUntilReceived ervoor zorgt dat de worker langer pauzeert dan de time-outlimiet voor scripts (standaard ingesteld op 15 seconden)
|
Verwante API-elementen
removeEventListener | () | methode |
override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Verwijdert een listener uit het object EventDispatcher. Wanneer geen overeenkomende listener is geregistreerd bij het object EventDispatcher, heeft een aanroep van deze methode geen invloed.
Parameters
type:String — Het type gebeurtenis.
| |
listener:Function — Het listenerobject dat wordt verwijderd.
| |
useCapture:Boolean (default = false ) —
Geeft aan of de listener is geregistreerd voor de vastleg-, doel- en terugkoppelfase. Wanneer de listener is geregistreerd voor zowel de vastlegfase als de doel- en terugkoppelfase, zijn twee aanroepen van de removeEventListener() nodig om beide te verwijderen, één met useCapture ingesteld op true en één met useCapture ingesteld op false .
|
send | () | methode |
public function send(arg:*, queueLimit:int = -1):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Verstuurt een object van de verzendende worker en voegt dit object toe aan de wachtrij met berichten voor de ontvangende worker.
Praktisch elk object kan worden doorgegeven aan de arg
-parameter. Met uitzondering van de onderstaande objecten, worden objecten die zijn doorgegeven aan de arg
-parameter, niet als referentie doorgegeven. Wijzigingen die worden doorgevoerd in het object van een worker nadat send()
is aangeroepen, worden niet doorgevoerd in de andere worker. Wanneer receive()
wordt aangeroepen, wordt het object via serienummering gekopieerd naar de AMF3-indeling en vervolgens weer via serienummering omgezet in een nieuw object in de ontvangende worker. Dit is ook waarom objecten die niet via serienummering kunnen worden omgezet in een AMF-indeling (zoals bijvoorbeeld weergaveobjecten), niet kunnen worden doorgegeven aan de arg
-parameter. Voor een juiste doorgave van een aangepaste klasse moet de klassendefinitie worden geregistreerd met de functie flash.net.registerClassAlias()
of met [RemoteClass]
-metagegevens. Voor beide methoden geldt dat hetzelfde alias moet worden gebruikt voor de klassenversies van beide workers.
Er zijn vijf objecttypen die een uitzondering vormen op de regel dat objecten niet daadwerkelijk worden gedeeld door workers:
- Worker-item
- MessageChannel
- deelbare ByteArray (een ByteArray-object waarvan de eigenschap
shareable
is ingesteld optrue
- Mutex
- Condition
Wanneer u een instantie van een van deze objecten doorgeeft met de arg
-parameter, beschikt elke worker over een referentie naar hetzelfde onderliggende object. Wijzigingen die in één worker worden toegepast op een instantie zijn dan direct beschikbaar in alle andere workers. Bovendien geldt dat als u eenzelfde instantie van deze objecten meerdere keren doorgeeft aan een worker met behulp van send()
, er niet telkens een nieuw exemplaar van het object in de ontvangende worker wordt gemaakt door de runtime. In plaats hiervan wordt dezelfde referentie opnieuw gebruikt, waardoor er minder systeemgeheugen in beslag wordt genomen.
Bij deze methode wordt het object standaard toegevoegd aan de wachtrij, waarna de volgende coderegel direct wordt uitgevoerd. Als u wilt voorkomen dat de wachtrij te groot wordt, kunt u met de parameter queueLimit
aangeven hoeveel items maximaal in de wachtrij zijn toegestaan. Wanneer de wachtrij meer items bevat dan de door u opgegeven limiet en de methode send()
wordt aangeroepen, pauzeert de worker de uitvoeringsthread bij de send()
-aanroep. Wanneer de ontvangende worker voldoende receive()
-aanroepen heeft uitgevoerd en de limiet voor de wachtrij niet meer wordt overschreden, wordt de send()-aanroep voltooid. Hierna vervolgt de worker de uitvoering vanaf de volgende coderegel.
Parameters
arg:* — het object dat moet worden toegevoegd aan de wachtrij
| |
queueLimit:int (default = -1 ) — het maximale aantal berichtobjecten dat de wachtrij kan bevatten. Als de wachtrij meer objecten bevat dan is toegestaan volgens de limiet, pauzeert de verzendende worker totdat er een aantal berichten is ontvangen en de limietwaarde van de wachtrij weer is bereikt.
|
Gebeurtenissen
channelMessage: — verzonden om aan te geven aan de ontvangende worker dat er een berichtobject beschikbaar is in de wachtrij
|
Gegenereerde uitzondering
IOError — als het kanaal wordt gesloten op het tijdstip dat de methode wordt aangeroepen, of als het argument queueLimit leidt tot het pauzeren van de uitvoering en het kanaal vervolgens wordt gesloten door een andere worker.
| |
ArgumentError — als de aanroepende code zich niet in de verzendende worker bevindt
| |
ScriptTimeoutError — als de methode wordt aangeroepen door code in de 'primordial worker' in Flash Player en het argument queueLimit ervoor zorgt dat de worker langer pauzeert dan de time-outlimiet voor scripts (standaard ingesteld op 15 seconden)
|
Verwante API-elementen
toString | () | methode |
override public function toString():String
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Retourneert een tekenreeksrepresentatie van het opgegeven object.
Opmerking: methoden van de klasse Object worden dynamisch gemaakt in het prototype van Object. Wanneer u deze methode opnieuw wilt definiëren in een subklasse van Object, moet u het trefwoord override
niet gebruiken. Bijvoorbeeld, een subklasse van Object implementeert de functie toString():String
in plaats van dat deze de basisklasse overschrijft.
String — De tekenreeksrepresentatie van het object.
|
channelMessage | Gebeurtenis |
flash.events.Event
eigenschap Event.type =
flash.events.Event.CHANNEL_MESSAGE
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Wordt telkens verzonden wanneer de verzendende worker de methode send()
van dit MessageChannel-object aanroept om aan te duiden dat er een nieuw berichtobject beschikbaar is in de wachtrij van de MessageChannel-instantie.
Event.CHANNEL_MESSAGE
definieert de waarde van de type
-eigenschap van een channelMessage
-gebeurtenisobject.
Deze gebeurtenis heeft de volgende eigenschappen:
Eigenschap | Waarde |
---|---|
bubbles | false |
cancelable | false ; er is geen standaardgedrag om te annuleren. |
currentTarget | Het object dat het gebeurtenisobject actief verwerkt met een gebeurtenislistener. |
target | Het object dat deze gebeurtenis heeft verzonden. |
channelState | Gebeurtenis |
flash.events.Event
eigenschap Event.type =
flash.events.Event.CHANNEL_STATE
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.4, AIR 3.4 |
Wordt verzonden wanneer de waarde van de state
-eigenschap van het berichtkanaal wordt gewijzigd.
Event.CHANNEL_STATE
definieert de waarde van de type
-eigenschap van een channelState
-gebeurtenisobject.
Deze gebeurtenis heeft de volgende eigenschappen:
Eigenschap | Waarde |
---|---|
bubbles | false |
cancelable | false ; er is geen standaardgedrag om te annuleren. |
currentTarget | Het object dat het gebeurtenisobject actief verwerkt met een gebeurtenislistener. |
target | Het object dat deze gebeurtenis heeft verzonden. |
Wed Jun 13 2018, 11:42 AM Z