Пакет | flash.system |
Класс | public final class MessageChannel |
Наследование | MessageChannel EventDispatcher Object |
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Каждый объект MessageChannel содержит очередь объектов-сообщений, поступающих от объекта-отправителя worker, которые необходимо передать объекту-получателю worker. Каждый вызов метода send()
приводит к добавлению объекта в очередь. Каждый вызов метода receive()
извлекает из очереди самый старый объект.
Экземпляры MessageChannel нельзя создавать напрямую путем вызова конструктора MessageChannel()
. Чтобы создать экземпляр MessageChannel, используйте метод createMessageChannel()
того объекта-отправителя Worker, указав в параметрах объект-получатель Worker.
Ниже показан типичный процесс отправки сообщений с помощью объекта MessageChannel.
-
Создайте канал сообщений, вызвав метод
createMessageChannel()
объекта-отправителя worker// In the sending worker swf var sendChannel:MessageChannel; sendChannel = Worker.current.createMessageChannel(receivingWorker);
-
Передайте канал сообщений другому объекту worker, вызвав метод
Worker.setSharedProperty()
или отправив его через существующий канал сообщенийreceivingWorker.setSharedProperty("incomingChannel", sendChannel);
-
Код объекта-получателя worker регистрирует в объекте MessageChannel приемник события
channelMessage
// In the receiving worker swf var incomingChannel:MessageChannel; incomingChannel = Worker.current.getSharedProperty("incomingChannel"); incomingChannel.addEventListener(Event.CHANNEL_MESSAGE, handleIncomingMessage);
-
Код объекта-отправителя worker отправляет сообщение с помощью метода
send()
// In the sending worker swf sendChannel.send("This is a message");
-
Среда выполнения вызывает обработчик события в коде объекта-получателя worker, что указывает на то, что событие было отправлено
// 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 }
-
Код объекта-получателя worker вызывает метод
receive()
для получения сообщения. Объект, возвращенный методомreceive()
имеет тот же тип данных, что и объект, переданный в методsend()
.var message:String = incomingChannel.receive() as String;
Кроме описанной выше асинхронной реализации, можно использовать реализацию, при которой метод receive()
приостанавливает выполнение кода объекта-получателя worker и ожидает отправки сообщения. Дополнительную информацию см. в описании метода receive()
.
Класс MessageChannel относится к типу объектов, которые используются совместно экземплярами Worker, а не копируются между ними. При передаче канала сообщений из одного объекта worker в другой путем вызова метода setSharedProperty()
объекта worker или с помощью объекта MessageChannel оба объекта worker располагают ссылками на один и тот же объект MessageChannel в памяти исполнительной среды.
Связанные элементы API
Свойство | Определено | ||
---|---|---|---|
constructor : Object
Ссылка на объект класса или функцию конструктора для данного экземпляра объекта. | Object | ||
messageAvailable : Boolean [только для чтения]
Указывает, содержится ли во внутренней очереди сообщений объекта MessageChannel одно или несколько сообщений от объекта-отправителя worker. | MessageChannel | ||
state : String [только для чтения]
Указывает текущее состояние объекта MessageChannel (открыт, в процессе закрытия или закрыт). | MessageChannel |
Метод | Определено | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void [переопределить]
Регистрирует объект прослушивателя события на объекте EventDispatcher для получения прослушивателем уведомления о событии. | MessageChannel | ||
Отправляет текущему элементу MessageChannel инструкцию закрытия после получения всех сообщений. | MessageChannel | ||
Посылает событие в поток событий. | EventDispatcher | ||
Проверяет, имеет ли объект EventDispatcher прослушиватели, зарегистрированные для определенного типа события. | EventDispatcher | ||
Показывает, определено ли заданное свойство для объекта. | Object | ||
Показывает, есть ли экземпляр класса Object в цепи прототипов объекта, заданного в качестве параметра. | Object | ||
Показывает наличие заданного свойства и его перечисляемость. | Object | ||
Извлекает один объект сообщения, отправленный через данный канал сообщений, из очереди сообщений. | MessageChannel | ||
[переопределить]
Удаляет прослушиватель из объекта EventDispatcher. | MessageChannel | ||
Добавляет объект из объекта-отправителя worker в очередь сообщений для объекта-получателя worker. | MessageChannel | ||
Задает доступность динамического свойства для операций цикла. | Object | ||
Возвращает строковое представление этого объекта, отформатированного в соответствии со стандартами, принятыми для данной локали. | Object | ||
[переопределить]
Возвращает строковое представление заданного объекта. | MessageChannel | ||
Возвращает элементарное значение заданного объекта. | Object | ||
Проверяет, зарегистрирован ли прослушиватель события для указанного типа события с данным объектом EventDispatcher или любым его предшественником. | EventDispatcher |
Событие | Сводка | Определено | ||
---|---|---|---|---|
[многоадресное событие] Отправляется, когда проигрыватель Flash Player или приложение AIR перемещается в фокус операционной системы и становится активным. | EventDispatcher | |||
Отправляется каждый раз после вызова объектом-отправителем worker метода send() данного объекта MessageChannel, указывая на то, что новый объект сообщения доступен в очереди этого экземпляра MessageChannel. | MessageChannel | |||
Отправляется, когда изменяется значение свойства state канала сообщений. | MessageChannel | |||
[многоадресное событие] Отправляется, когда проигрыватель Flash Player или приложение AIR теряет фокус системы и становится неактивным. | EventDispatcher |
messageAvailable | свойство |
messageAvailable:Boolean
[только для чтения] Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Указывает, содержится ли во внутренней очереди сообщений объекта MessageChannel одно или несколько сообщений от объекта-отправителя worker.
Реализация
public function get messageAvailable():Boolean
state | свойство |
state:String
[только для чтения] Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Указывает текущее состояние объекта MessageChannel (открыт, в процессе закрытия или закрыт). Возможные значения этого свойства определены как константы в классе MessageChannelState.
Реализация
public function get state():String
Связанные элементы API
addEventListener | () | метод |
override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Регистрирует объект прослушивателя события на объекте EventDispatcher для получения прослушивателем уведомления о событии. Можно регистрировать прослушиватели событий в любом узле из списка отображения для каждого типа события, фазы и приоритета.
После успешной регистрации прослушивателя событий невозможно изменить его приоритет путем дополнительных вызовов addEventListener()
. Чтобы изменить приоритет прослушивателя, необходимо сначала вызвать метод removeListener()
. Затем можно снова зарегистрировать прослушиватель с новым приоритетом.
Следует учесть, что после регистрации прослушивателя последующие вызовы метода addEventListener()
с другим значением свойства type
или useCapture
приводят к регистрации другого прослушивателя. Например, прослушиватель, изначально зарегистрированный со значением useCapture
, равным true
, прослушивает только во время фазы захвата. Если вызвать метод addEventListener()
еще раз с тем же объектом прослушивателя, но со свойством useCapture
в значении false
, то будет два прослушивателя: один — прослушивающий в фазе захвата, а другой — в целевой фазе и фазе восходящей цепочки.
Невозможно зарегистрировать прослушиватель события только для целевой фазы или для фазы восходящей цепочки. Эти фазы соединены при регистрации, поскольку восходящая цепочка применяется только к предшественникам целевого узла.
Если прослушиватель событий больше не нужен, его можно удалить, вызвав метод removeEventListener()
, иначе могут возникнуть проблемы с памятью. Прослушиватели событий не удаляются из памяти автоматически, так как сборщик мусора не удаляет прослушиватель, пока существует объект, отправляющий соответствующее событие (если параметру useWeakReference
не задано значение true
).
Копирование экземпляра EventDispatcher не приводит к копированию прослушивателей событий, присоединенных к нему. (Если для вновь создаваемого узла требуется прослушиватель событий, его необходимо присоединить после создания узла.) При этом при перемещении экземпляра EventDispatcher присоединенные к нему прослушиватели событий перемещаются вместе с ним.
Если прослушиватель регистрируется для узла в тот момент, когда на нем обрабатывается событие, то в текущей фазе он не запускается, однако может запуститься в следующей фазе потока события, например в фазе восходящей цепочки.
Прослушиватель событий, удаленный из узла во время обработки события на этом узле, будет запускаться текущими операциями. После удаления прослушиватель событий больше не вызывается (если не будет снова зарегистрирован для дальнейшей обработки).
Параметры
type:String — Тип события.
| |
listener:Function — Функция прослушивателя, обрабатывающая событие. Эта функция должна принимать объект Event в качестве единственного параметра и не должна что-либо возвращать , как показано в примере:
function(evt:Event):void Эта функция может иметь любое имя. | |
useCapture:Boolean (default = false ) —
Определяет, работает ли прослушиватель в фазе захвата или в целевой фазе и в фазе восходящей цепочки. Если значение useCapture равно true , прослушиватель обрабатывает событие только во время фазы захвата, но не во время целевой фазы или фазы восходящей цепочки. Если значение useCapture равно false , то прослушиватель обрабатывает событие только в целевой фазе или фазе восходящей цепочки. Чтобы прослушивать событие во всех трех фазах, необходимо вызвать addEventListener() дважды: один раз с useCapture в значении true , а другой — с useCapture в значении false .
| |
priority:int (default = 0 ) — Уровень приоритета прослушивателя событий. Приоритет определяется 32-разрядным целым числом со знаком. Чем больше число, тем выше приоритет. Все прослушиватели событий с приоритетом n обрабатываются перед прослушивателями с приоритетом n-1. Прослушиватели с одинаковым приоритетом обрабатываются в порядке их добавления. Значение приоритета по умолчанию равно 0.
| |
useWeakReference:Boolean (default = false ) — Определяет, является ли ссылка на прослушиватель «сильной» или «слабой». «Сильная» ссылка (по умолчанию) предотвращает удаление прослушивателя сборщиком мусора. «Слабая» ссылка позволяет удалить прослушиватель. Функции элементов уровня класса не подлежат удалению в качестве мусора, вследствие чего можно установить |
close | () | метод |
public function close():void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Отправляет текущему элементу MessageChannel инструкцию закрытия после получения всех сообщений.
После вызова этого метода вы не можете больше вызывать метод send()
для добавления сообщений в очередь. Вызов send()
в таком случае завершится неудачей, и метод вернет false
.
Также вы можете использовать метод receive()
только для получения сообщений, уже находящихся в очереди. Если очередь пуста, метод receive()
вернет значение null
.
События
channelState: — отправляется при вызове метода close() (устанавливающего свойство state в значение MessageChannelState.CLOSING ). Отправляется еще раз, когда все сообщения были получены и свойство state установлено в значение MessageChannelState.CLOSED .
|
receive | () | метод |
public function receive(blockUntilReceived:Boolean = false):*
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Извлекает один объект сообщения, отправленный через данный канал сообщений, из очереди сообщений.
Каждый раз, когда код объекта-отправителя worker вызывает метод send()
объекта MessageChannel, во внутреннюю очередь канала сообщений добавляется один объект. Добавленные объекты извлекаются из очереди по одному при вызове в объекте-получателе worker метода receive()
. Объекты сообщений поступают в том же порядке, в котором они были отправлены.
Чтобы проверить, есть ли в очереди сообщений объект, который можно получить, используйте свойство messageAvailable
.
В стандартном случае объект, переданный в метод send()
, сериализуется в формате AMF3. При удалении из очереди в результате вызова метода receive()
он десериализуется в объект ActionScript (копию исходного объекта) и объект-получатель worker получает ссылку на эту копию. Некоторые типы объектов не копируются, а используются объектами worker совместно. В этом случае объект, который получает объект-получатель worker, представляет собой ссылку на общий объект, а не копию объекта. Подробнее об этом случае см. в описании метода send()
.
Поведение этого метода отличается, если очередь сообщений пуста и параметра blockUntilReceived
имеет значение true
. В этом случае поток выполнения объекта worker приостанавливается в момент вызова метода receive()
. После вызова объектом-отправителем worker метода send()
вызов метода receive()
завершается получением сообщения. Выполнение кода объекта worker затем возобновляется со строки, следующей за вызовом метода receive().
Параметры
blockUntilReceived:Boolean (default = false ) — определяет, будет ли поток выполнения worker получать объект сообщения и затем продолжать выполнение (false ) или останавливаться при вызове метода receive() и ждать отправки сообщения, если очередь пуста (true )
|
* — копия объекта передана в метод send() объектом-отправителем worker. Если объект принадлежит к одному из типов объектов, которые являются общими для различных объектов worker, то возвращается ссылка на общий объект, а не его копия. Если в очереди нет сообщений, метод возвращает null .
|
Выдает
IOError — если в момент вызова метода канал закрыт или если передача параметра blockUntilReceived привела к приостановке выполнения и канал был затем закрыт другим объектом worker.
| |
ArgumentError — если вызывающий код не находится в объекте-получателе worker
| |
ScriptTimeoutError — если метод вызван из кода первоначального объекта worker в Flash Player и параметр blockUntilReceived привел к приостановке выполнения на время, превышающее таймаут сценария (по умолчанию —15 секунд)
|
Связанные элементы API
removeEventListener | () | метод |
override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Удаляет прослушиватель из объекта EventDispatcher. При отсутствии прослушивателя, зарегистрированного с объектом EventDispatcher, вызов этого метода не оказывает эффекта.
Параметры
type:String — Тип события.
| |
listener:Function — Удаляемый объект прослушивателя.
| |
useCapture:Boolean (default = false ) —
Указывает, был ли прослушиватель зарегистрирован для фазы захвата или целевой фазы и фазы восходящей цепочки. Если прослушиватель зарегистрирован и для фазы захвата, и для фаз цели и восходящей цепочки, метод removeEventListener() необходимо вызвать дважды: один раз с useCapture() в значении true , а другой раз с useCapture() в значении false .
|
send | () | метод |
public function send(arg:*, queueLimit:int = -1):void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Добавляет объект из объекта-отправителя worker в очередь сообщений для объекта-получателя worker.
В параметре arg
можно передать практически любой объект. За исключением случаев, описанных ниже, объект в параметре arg
не передается по ссылке. Любые изменения объекта, производимые в одном объекте worker после вызова метода send()
не передаются в другой объект worker. Объект копируется путем сериализации в формате AMF3 и последующей десериализации в новый объект в объекте-получателе worker при вызове метода receive()
. По этой причине любой объект, не сериализуемый в формате AMF3, в том числе отображаемые объекты, не может передаваться в параметре arg
. Для корректной пересылки пользовательского класса его определение должно быть зарегистрировано с помощью функции flash.net.registerClassAlias()
или метаданных [RemoteClass]
. В любом из указанных методов должен использоваться один и тот же псевдоним для обоих версий класса в каждом из объектов worker.
Существует пять типов объектов, которые не копируются между объектами worker, а используются ими совместно:
- Worker
- MessageChannel
- общий ByteArray (объект ByteArray, у которого свойство
shareable
имеет значениеtrue
- объект Mutex
- объект Condition
При передаче экземпляров этих объектов в параметре arg
, каждый объект worker получает ссылку на один и тот же исходный объект. Изменения, производимые над экземпляром объекта, моментально становятся доступны в других объектах worker. Кроме того, при многократной отправке с помощью метода send()
одного и того же объекта, принадлежащего одному из этих типов, исполнительная среда не создает новые копии этого объекта в объекте-получателе worker. Вместо этого повторно используется одна и та же ссылка, что снижает расход системной памяти.
По умолчанию данный метод немедленно возвращает управление после добавления объекта к очереди, и выполнение продолжается со следующей строки кода. Чтобы ограничить максимальный размер очереди, используйте параметр queueLimit
, который определяет наибольшее допустимое количество объектов в очереди. Если на момент вызова метода send()
количество объектов в очереди превышает указанный предел, выполнение потока будет приостановлено в точке вызова метода send()
. После того как объект-получатель worker вызовет метод receive()
достаточное количество раз, чтобы количество элементов в очереди стало меньше предельного значения, вызов send() будет завершен. Выполнение объекта worker затем продолжается со следующей строки кода.
Параметры
arg:* — объект, который необходимо добавить к очереди сообщений
| |
queueLimit:int (default = -1 ) — максимальное количество объектов сообщений в очереди сообщений. Если количество объектов в очереди сообщений превышает предел, объект-отправитель worker приостанавливает выполнение до тех пор, пока сообщения не дойдут до получателя и пока размер очереди не станет меньше предельного значения.
|
События
channelMessage: — отправляется для уведомления объекта-получателя worker о том, что в очереди доступен объект сообщения
|
Выдает
IOError — если в момент вызова метода канал закрыт или если параметр queueLimit привел к приостановке выполнения и канал был затем закрыт другим объектом worker.
| |
ArgumentError — если вызывающий код не находится в объекте-отправителе worker
| |
ScriptTimeoutError — если метод вызван из кода первоначального объекта worker в Flash Player и параметр queueLimit привел к приостановке выполнения на время, превышающее таймаут сценария (по умолчанию —15 секунд)
|
Связанные элементы API
toString | () | метод |
override public function toString():String
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Возвращает строковое представление заданного объекта.
Примечание. Методы класса Object динамически создаются в прототипе Object. Чтобы переопределить этот метод в подклассе Object, не используйте ключевое слово override
. Например, в подклассе Object вместо переопределения базового класса применяется function toString():String
.
String — Строковое представление объекта.
|
channelMessage | Событие |
flash.events.Event
свойство Event.type =
flash.events.Event.CHANNEL_MESSAGE
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Отправляется каждый раз, когда объект-отправитель worker вызывает метод send()
данного объекта MessageChannel, и указывая на то, что новый объект сообщения доступен в очереди этого экземпляра MessageChannel.
Event.CHANNEL_MESSAGE
определяет значение свойства type
объекта события channelMessage
.
Это событие имеет следующие свойства:
Свойство | Значение |
---|---|
bubbles | false |
cancelable | false ; поведение по умолчанию, подлежащее отмене, не определено. |
currentTarget | Объект, активно обрабатывающий объект Event с помощью прослушивателя событий. |
target | Объект, отправивший это событие. |
channelState | Событие |
flash.events.Event
свойство Event.type =
flash.events.Event.CHANNEL_STATE
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.4, AIR 3.4 |
Отправляется, когда изменяется значение свойства state
канала сообщений.
Event.CHANNEL_STATE
определяет значение свойства type
объекта события channelState
.
Это событие имеет следующие свойства:
Свойство | Значение |
---|---|
bubbles | false |
cancelable | false ; поведение по умолчанию, подлежащее отмене, не определено. |
currentTarget | Объект, активно обрабатывающий объект Event с помощью прослушивателя событий. |
target | Объект, отправивший это событие. |
Tue Jun 12 2018, 11:34 AM Z