Как поставить несколько событий в очередь на один обработчик событий в сценарии действий 3?

Я создаю фреймворк для загрузки мини-игр (в формате swf) и столкнулся с проблемой.

В настоящее время у меня есть прослушиватель, который прослушивает события, которые дочерняя мини-игра отправляет в родительскую структуру. Однако, если дочерний элемент отправляет два сообщения (события) слишком близко друг к другу, кажется, что первое событие просто игнорируется, из-за чего некоторые сообщения вообще не достигают родительского фреймворка.

Я читал, что вы можете каким-то образом ставить в очередь события actionscript, чтобы события обрабатывались в порядке FIFO. Как я могу это сделать? Документации по этому вопросу, похоже, довольно мало, поэтому я в тупике.

Большое спасибо!


person futureelite7    schedule 03.06.2009    source источник
comment
хммм... это ДЕЙСТВИТЕЛЬНО странно... AVM2 является однопоточным... если вы отправляете событие, то перед продолжением выполнения вызываются ВСЕ функции обработчика... не могли бы вы сузить круг и опубликовать минимальную настройку, чтобы воспроизвести проблему ? приветствие back2dos   -  person back2dos    schedule 03.06.2009
comment
Да, это определенно звучит так, будто здесь происходит что-то еще. Возможно, опубликуйте свой код отправки событий и немного объясните структуру. Отправляются ли они из одного и того же места одним и тем же способом?   -  person Tyler Egeto    schedule 04.06.2009
comment
При дальнейшем расследовании кажется, что я отправил событие, которое убило дочерний swf, прежде чем он успел отправить другое сообщение (поскольку AVM2 является однопоточным). Итак, проблема решена! Спасибо за вашу помощь.   -  person futureelite7    schedule 04.06.2009


Ответы (1)


Вы действительно должны опубликовать код с такими вопросами; остальные правы — похоже, вы где-то допустили ошибку, и намного легче помочь с такими проблемами, когда они сопровождаются каким-то кодом.

Тем не менее, даже если вы отправили свои события в жестком цикле, например:

addEventListener("foo", handleFoo, false, 0);

for (var i:int = 0; i < 100; i++)
{
   dispatchEvent(new FlexEvent("foo"));
}

private function handleFoo(event:Event):void
{
   trace("hello");
}

... вы увидите столько «приветов», сколько итераций этого цикла; это не становится намного «ближе друг к другу», чем это. Вы можете назначить приоритет обработке событий — например, этот слушатель вызывается первым (отсюда «0» выше), этот другой слушатель вызывается вторым («1») и так далее — с использованием приоритета аргумент функции addEventListener (опять же, см. выше), но это все. Встроенной очереди диспетчеризации событий нет, если вы сами не напишете очередь.

person Christian Nunciato    schedule 04.06.2009