Paquete | flash.system |
Clase | public final class MessageChannel |
Herencia | MessageChannel EventDispatcher Object |
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Cada objeto MessageChannel contiene una cola de objetos de mensaje enviados del programa de trabajo emisor al programa de trabajo receptor. Cada llamada a send()
añade un objeto a la cola. Cada llamada a receive()
recupera el objeto de mensaje más antiguo de la cola.
No es posible crear instancias de MessageChannel directamente llamando al constructor MessageChannel()
. Para crear una instancia de MessageChannel, llame al método createMessageChannel()
del objeto Worker que enviará mensajes en el canal, y transfiera como argumento el objeto Worker receptor.
El flujo de trabajo típico para enviar mensajes con un objeto MessageChannel es el siguiente:
-
Llame al método
createMessageChannel()
del programa de trabajo emisor para crear el canal de mensajes// In the sending worker swf var sendChannel:MessageChannel; sendChannel = Worker.current.createMessageChannel(receivingWorker);
-
Transfiera el canal de mensajes al otro programa de trabajo, bien llamando a
Worker.setSharedProperty()
o enviándolo a través del canal de mensajes existentereceivingWorker.setSharedProperty("incomingChannel", sendChannel);
-
El código del programa de trabajo receptor registra un detector con el objeto MessageChannel para el evento
channelMessage
// In the receiving worker swf var incomingChannel:MessageChannel; incomingChannel = Worker.current.getSharedProperty("incomingChannel"); incomingChannel.addEventListener(Event.CHANNEL_MESSAGE, handleIncomingMessage);
-
El código del programa de trabajo emisor envía un mensaje llamando al método
send()
// In the sending worker swf sendChannel.send("This is a message");
-
El motor de ejecución llama al controlador de eventos en el código del programa de trabajo receptor para indicar que se ha enviado un mensaje
// 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 }
-
El código del programa de trabajo receptor llama al método
receive()
para obtener el mensaje. El objeto devuelto por el métodoreceive()
tiene el mismo tipo de datos que el objeto transferido al métodosend()
.var message:String = incomingChannel.receive() as String;
Además del flujo de trabajo asincrónico detallado anteriormente, puede utilizar uno alternativo con el método receive()
para poner en pausa el código en el programa de trabajo receptor y esperar a que se envíe un mensaje. Consulte la descripción del método receive()
para obtener más información.
La clase MessageChannel es uno de los tipos de objeto especiales que comparten programas de trabajo en vez de copiarlo entre ellos. Cuando se transfiere un canal de mensajes de un programa de trabajo a otro, bien llamando al método setSharedProperty()
del objeto Worker o utilizando un objeto MessageChannel, los dos programas de trabajo tienen una referencia al mismo objeto MessageChannel en la memoria del motor de ejecución.
Elementos de API relacionados
Propiedad | Definido por | ||
---|---|---|---|
constructor : Object
Una referencia a la clase de objeto o función constructora para una instancia de objeto determinada. | Object | ||
messageAvailable : Boolean [solo lectura]
Indica si el objeto MessageChannel tiene uno o más mensajes del programa de trabajo emisor en su cola de mensajes interna. | MessageChannel | ||
state : String [solo lectura]
Indica el estado actual del objeto MessageChannel (abierto, cerrándose o cerrado). | MessageChannel |
Método | Definido por | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void [override]
Registra un objeto de detector de eventos con un objeto EventDispatcher, de modo que el detector reciba la notificación de un evento. | MessageChannel | ||
Indica al MessageChannel actual que debe cerrarse cuando se hayan recibido todos los mensajes. | MessageChannel | ||
Distribuye un evento en el flujo del evento. | EventDispatcher | ||
Comprueba si el objeto EventDispatcher tiene detectores registrados para un tipo concreto de evento. | EventDispatcher | ||
Indica si un objeto tiene definida una propiedad especificada. | Object | ||
Indica si hay una instancia de la clase Object en la cadena de prototipo del objeto especificado como parámetro. | Object | ||
Indica si existe la propiedad especificada y si es enumerable. | Object | ||
Recupera un único objeto de mensaje de la cola de mensajes enviados a través de este canal de mensajes. | MessageChannel | ||
[override]
Elimina un detector del objeto EventDispatcher. | MessageChannel | ||
Envía una mensaje desde el programa de trabajo emisor y lo añade a la cola de mensajes para el programa de trabajo receptor. | MessageChannel | ||
Establece la disponibilidad de una propiedad dinámica para operaciones de bucle. | Object | ||
Devuelve la representación de cadena de este objeto, con formato según las convenciones específicas de configuración regional. | Object | ||
[override]
Devuelve la representación de cadena del objeto especificado. | MessageChannel | ||
Devuelve el valor simple del objeto especificado. | Object | ||
Comprueba si hay registrado un detector de eventos con este objeto EventDispatcher o con cualquiera de sus ascendientes para el tipo de evento concreto. | EventDispatcher |
Evento | Resumen | Definido por | ||
---|---|---|---|---|
[evento broadcast] Se distribuye cuando Flash Player o AIR pasan a estar activos. | EventDispatcher | |||
Se distribuye cada vez que el programa de trabajo emisor llama a este método send() del objeto MessageChannel para indicar que hay un nuevo objeto de mensaje disponible en la cola de la instancia de MessageChannel. | MessageChannel | |||
Se distribuye cuando cambia el valor de la propiedad state del canal de mensajes. | MessageChannel | |||
[evento broadcast] Se distribuye cuando Flash Player o de AIR pasan a estar inactivos. | EventDispatcher |
messageAvailable | propiedad |
messageAvailable:Boolean
[solo lectura] Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Indica si el objeto MessageChannel tiene uno o más mensajes del programa de trabajo emisor en su cola de mensajes interna.
Implementación
public function get messageAvailable():Boolean
state | propiedad |
state:String
[solo lectura] Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Indica el estado actual del objeto MessageChannel (abierto, cerrándose o cerrado). Los valores posibles de esta propiedad se definen como constantes en la clase MessageChannelState.
Implementación
public function get state():String
Elementos de API relacionados
addEventListener | () | método |
override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Registra un objeto de detector de eventos con un objeto EventDispatcher, de modo que el detector reciba la notificación de un evento. Puede registrar detectores de eventos en todos los nodos de la lista de visualización para un tipo concreto de evento, fase y prioridad.
Una vez registrado correctamente un detector de eventos, no puede cambiar su prioridad mediante llamadas adicionales a addEventListener()
. Para cambiar la prioridad de un detector, en primer lugar debe llamar a removeListener()
. Seguidamente, puede volver a registrar el nuevo nivel de prioridad.
Recuerde que, una vez registrado el detector, las siguientes llamadas a addEventListener()
con un valor type
o useCapture
distinto tendrán como resultado la creación de un registro independiente del detector. Por ejemplo, si registra primero un detector con useCapture
definido como true
, detectará únicamente durante la fase de captura. Si vuelve a llamar a addEventListener()
con el mismo objeto detector, pero con useCapture
definido como false
, tendrá dos detectores independientes: uno que detecta durante la fase de captura y otro que lo hace durante las fases de destino y de propagación.
No es posible registrar un detector de eventos únicamente para la fase de destino o la fase de propagación. Dichas fases se acoplan durante el registro, ya que la propagación sólo se aplica a los ascendientes del nodo de destino.
Si ya no necesita ningún detector de eventos, elimínelo llamando a removeEventListener()
; de lo contrario, podrían surgir problemas de memoria. Los detectores de eventos no se eliminan automáticamente de la memoria, ya que el recolector de datos innecesarios no elimina el detector siempre que el objeto distribuido exista (a no ser que el parámetro useWeakReference
se establezca en true
).
Al copiar una instancia EventDispatcher no se copian los detectores de eventos asociados. (Si el nodo recién creado necesita un detector de eventos, debe asociarlo después de crear el nodo.) Sin embargo, si mueve una instancia EventDispatcher, los detectores de eventos asociados se moverán también.
Si el detector de eventos se registra en un nodo mientras se procesa un evento en dicho nodo, el detector de eventos no se desencadenará durante la fase actual, aunque sí se desencadenará en una fase posterior del flujo del evento, por ejemplo, en la fase de propagación.
Si un detector de eventos se elimina de un nodo mientras se procesa un evento en dicho nodo, las acciones actual seguirán desencadenándolo. Una vez eliminado, el detector de eventos ya no se vuelve a invocar nunca más (a no ser que se registre de nuevo para otro proceso).
Parámetros
type:String — El tipo de evento.
| |
listener:Function — La función del detector que procesa el evento. Esta función debe aceptar un objeto de evento como parámetro único y no debe devolver ningún valor, tal como indica el siguiente ejemplo:
function(evt:Event):void La función puede tener cualquier nombre. | |
useCapture:Boolean (default = false ) —
Determina si el detector funciona en la fase de captura o en las fases de destino y de propagación. Si useCapture se define como true , el detector procesa el evento sólo durante la fase de captura y no en las fases de destino o propagación. Si useCapture es false , el detector procesa el evento sólo durante la fase de destino o de propagación. Para detectar el evento en las tres fases, llame dos veces a addEventListener , una con useCapture establecido en true y, después, otra con useCapture definido como false .
| |
priority:int (default = 0 ) — El nivel de prioridad del detector de eventos. La prioridad viene designada por un entero de 32 bits sin signo. Cuanto mayor sea el número, mayor será la prioridad. Todos los detectores con prioridad n se procesan antes que los detectores con prioridad n-1. Si dos o más detectores comparten la misma prioridad, se procesarán en el orden en el que se añadieron. La prioridad predeterminada es 0.
| |
useWeakReference:Boolean (default = false ) — Determina si la referencia al detector es fuerte o débil. Una referencia fuerte (valor predeterminado) impide que el detector sea eliminado por el recolector de datos innecesarios. Una referencia débil no lo hace. Las funciones de miembros de clase no están sujetas a la recolección de elementos no utilizados, por lo que |
close | () | método |
public function close():void
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Indica al MessageChannel actual que debe cerrarse cuando se hayan recibido todos los mensajes.
Cuando se llama a este método, ya no es posible llamar al método send()
para añadir mensajes a la cola. La llamada a send()
fallará y devolverá false
.
También puede llamar solo al método receive()
para recibir mensajes que ya estén esperando en la cola. Si la cola está vacía, la llamada a receive()
devolverá null
.
Eventos
channelState: — se distribuye cuando se llama al método close() (que establece la propiedad state en MessageChannelState.CLOSING ). Se vuelve a distribuir cuando se han recibido todos los mensajes y la propiedad state se establece en MessageChannelState.CLOSED .
|
receive | () | método |
public function receive(blockUntilReceived:Boolean = false):*
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Recupera un único objeto de mensaje de la cola de mensajes enviados a través de este canal de mensajes.
Cada vez que el código del programa de trabajo llama al método send()
del objeto MessageChannel, se añade un único objeto a la cola de mensajes interna del canal de mensajes. Estos objetos se apilan en la cola hasta que el programa de trabajo receptor los elimina uno a uno mediante llamadas al método receive()
. Los objetos de mensaje se reciben en el orden en el que se envían.
Para comprobar si la cola contiene un objeto de mensaje para recibir, utilice la propiedad messageAvailable
.
En un caso habitual, el objeto transferido a send()
se serializa en formato AMF3. Cuando se elimina de la cola mediante la llamada a receive()
, se deserializa en un objeto de ActionScript (una copia del objeto original) en el programa de trabajo receptor y el programa de trabajo recibe una referencia a dicha copia. Determinados tipos de objetos se comparten entre programas de trabajo en vez de copiarse. En dicho caso, el objeto que obtiene el programa de trabajo receptor es una referencia al propio objeto compartido en vez de una nueva copia del objeto. Para obtener más información sobre este caso, consulte la descripción del método send()
.
El comportamiento del método cambia si la cola de mensajes está vacía y se transfiere true
para el parámetro blockUntilReceived
. En ese caso, el programa de trabajo pone en pausa su subproceso de ejecución en la llamada a receive()
y no ejecuta más código. Cuando el programa de trabajo emisor llama a send()
, la llamada a receive()
finaliza con la recepción del mensaje. Seguidamente, el programa de trabajo reanuda la ejecución del código en la siguiente línea de código posterior a la llamada a receive.
Parámetros
blockUntilReceived:Boolean (default = false ) — indica si el subproceso de ejecución del programa de trabajo debe recibir un objeto de mensaje y después proseguir con la ejecución (false ), o si debe ponerse en pausa en la llamada a receive() y esperar a que se envíe un mensaje si la cola está vacía (true )
|
* — una copia del objeto transferido al método send() por el programa de trabajo emisor. Si el objeto es de uno de los tipos especiales que se comparten entre programas de trabajo, el valor devuelto es una referencia al objeto compartido en vez de una copia. Si no hay ningún mensaje disponible en la cola, el método devuelve null .
|
Emite
IOError — si el canal está cerrado en el momento en que se llama al método o si el argumento blockUntilReceived produce como resultado la pausa de la ejecución y el canal se cierra a cargo de otro programa de trabajo.
| |
ArgumentError — si el código de la llamada no se encuentra en el programa de trabajo receptor
| |
ScriptTimeoutError — si se llama al método desde el código en el programa de trabajo primordial en Flash Player y el argumento blockUntilReceived hace que el programa de trabajo se ponga en pausa más allá del tiempo límite de inactividad del script (de forma predeterminada, 15 segundos)
|
Elementos de API relacionados
removeEventListener | () | método |
override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Elimina un detector del objeto EventDispatcher. Si no hay ningún detector coincidente registrado con el objeto EventDispatcher, la llamada a este método no surtirá ningún efecto.
Parámetros
type:String — El tipo de evento.
| |
listener:Function — El objeto detector que se va a eliminar.
| |
useCapture:Boolean (default = false ) —
Especifica si el detector se registró para la fase de captura o para las fases de destino y de propagación. Si el detector se registró tanto para la fase de captura como para las fases de destino y de propagación, se necesitarán dos llamadas a removeEventListener() para eliminar ambos detectores: una llamada con useCapture() definido como true y otra llamada con useCapture() establecido en false .
|
send | () | método |
public function send(arg:*, queueLimit:int = -1):void
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Envía una mensaje desde el programa de trabajo emisor y lo añade a la cola de mensajes para el programa de trabajo receptor.
El objeto transferido al parámetro arg
puede ser prácticamente cualquier objeto. Salvo por las excepciones siguientes, cualquier objeto transferido al parámetro arg
no se transfiere por referencia. Cualquier cambio realizado en el objeto de un programa de trabajo después de llamar a send()
no se transmite al otro programa de trabajo. El objeto se copia mediante su serialización a formato AMF3 y deserializándolo después en un nuevo objeto en el programa de trabajo receptor cuando se llama a receive()
. Por este motivo, cualquier objeto que no pueda serializarse en formato AMF3, incluidos los objetos de visualización, no se podrán transferir al parámetro arg
. Para que una clase personalizada se pueda transferir correctamente, la definición de la clase debe registrarse con la función flash.net.registerClassAlias()
o los metadatos [RemoteClass]
. Con cualquiera de las dos técnicas, se debe utilizar el mismo alias para ambas versiones del programa de trabajo de la clase.
Existen cinco tipos de objetos que sirven de excepción a la regla que dicta que los objetos no se comparten entre programas de trabajo:
- El programa de trabajo
- MessageChannel
- ByteArray compartible (un objeto ByteArray con su propiedad
shareable
establecida entrue
- Mutex
- Condición
Si se transfiere una instancia de estos objetos al parámetro arg
, cada programa de trabajo tendrá una referencia al mismo objeto subyacente. Los cambios realizados en la instancia de un programa de trabajo estarán disponibles inmediatamente en los demás programas de trabajo. Además, si transfiere la misma instancia de estos objetos más de una vez con send()
, el motor de ejecución no creará una copia nueva del objeto en el programa de trabajo receptor. En su lugar, se reutilizará la misma referencia para reducir así el uso de memoria del sistema.
De forma predeterminada, este método añade el objeto a la cola y lo devuelve inmediatamente para proseguir con la ejecución de la siguiente línea de código. Si desea evitar que la cola crezca por encima de un tamaño determinado, puede utilizar el parámetro queueLimit
para especificar el número máximo de elementos permitidos en la cola. Si en el momento de la llamada a send()
el número de elementos de la cola es mayor que el límite especificado, el programa de trabajo pondrá en pausa el subproceso de ejecución en la llamada a send()
. Cuando el programa de trabajo receptor llama a receive()
el número suficiente de veces para conseguir que el tamaño de la cola quede por debajo del límite especificado, la llamada a send() finaliza. Seguidamente, el programa de trabajo continúa con la ejecución de la siguiente línea de código.
Parámetros
arg:* — el objeto que se añade a la cola de mensajes
| |
queueLimit:int (default = -1 ) — el número máximo de objetos de mensaje que puede contener la cola de mensajes. Si el número de mensajes de la cola supera el límite permitido, el programa de trabajo emisor pone en pausa la ejecución hasta que dejan de recibirse mensajes y el tamaño de la cola vuelve a estar por debajo del límite.
|
Eventos
channelMessage: — se distribuye para indicar al programa de trabajo receptor que hay un objeto de mensaje disponible en la cola
|
Emite
IOError — si el canal está cerrado en el momento en que se llama al método o si el argumento queueLimit produce como resultado la pausa de la ejecución y el canal se cierra a cargo de otro programa de trabajo.
| |
ArgumentError — si el código de llamada no se encuentra en el programa de trabajo emisor
| |
ScriptTimeoutError — si se llama al método desde el código en el programa de trabajo primordial en Flash Player y el argumento queueLimit hace que el programa de trabajo se ponga en pausa más allá del tiempo límite de inactividad del script (de forma predeterminada, 15 segundos)
|
Elementos de API relacionados
toString | () | método |
override public function toString():String
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Devuelve la representación de cadena del objeto especificado.
Nota: los métodos de la clase Object se crean dinámicamente en el prototipo de Object. Para redefinir este método en una subclase de Object, no utilice la palabra clave override
. Por ejemplo, una subclase de Object implementa function toString():String
en lugar de utilizar una sustitución de la clase base.
String — Una representación de cadena del objeto.
|
channelMessage | Evento |
flash.events.Event
propiedad Event.type =
flash.events.Event.CHANNEL_MESSAGE
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Se distribuye cada vez que el programa de trabajo emisor llama a este método send()
del objeto MessageChannel para indicar que hay un nuevo objeto de mensaje disponible en la cola de la instancia de MessageChannel.
Event.CHANNEL_MESSAGE
define el valor de la propiedad type
para un objeto de evento channelMessage
.
Este evento tiene las propiedades siguientes:
Propiedad | Valor |
---|---|
bubbles | false |
cancelable | false ; no hay ningún comportamiento predeterminado que cancelar. |
currentTarget | Objeto que procesa de forma activa el objeto de evento con un detector de eventos. |
target | El objeto que inició este evento. |
channelState | Evento |
flash.events.Event
propiedad Event.type =
flash.events.Event.CHANNEL_STATE
Versión del lenguaje: | ActionScript 3.0 |
Versiones de motor de ejecución: | Flash Player 11.4, AIR 3.4 |
Se distribuye cuando cambia el valor de la propiedad state
del canal de mensajes.
Event.CHANNEL_STATE
define el valor de la propiedad type
de un objeto de evento channelState
.
Este evento tiene las propiedades siguientes:
Propiedad | Valor |
---|---|
bubbles | false |
cancelable | false ; no hay ningún comportamiento predeterminado que cancelar. |
currentTarget | Objeto que procesa de forma activa el objeto de evento con un detector de eventos. |
target | El objeto que inició este evento. |
Tue Jun 12 2018, 02:12 PM Z