Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.06.2018, 18:26
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 11  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
Цитата:
Сообщение от undefined Посмотреть сообщение
Ну ты видишь что порядок добавления слушателей таки влияет на порядок их вызова?
Я нигде не говорил, про порядок вызова зарегистрированных слушателей. Речь про "порядок распространения событий (во множественном числе)". Набросал грубый пример:
Код AS3:
mc.addEventListener("asdf",handler1,false,int.MIN_VALUE);
mc.addEventListener("asdf",handler2,false,int.MIN_VALUE);
mc.addEventListener("qwer",handler3);
mc.addEventListener("qwer",handler4);
mc.dispatchEvent(new Event("asdf"));
 
function handler1(e:Event):void {
	trace("handler 1");
 
	mc.dispatchEvent(new Event("qwer"));
}
function handler2(e:Event):void {
	trace("handler 2");
}
function handler3(e:Event):void {
	trace("handler 3");
}
function handler4(e:Event):void {
	trace("handler 4");
}
//output:
// handler 1
// handler 3
// handler 4
// handler 2

Старый 12.06.2018, 19:34
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 12  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Это абсолютно нормальное поведение (Стек вызова). Слушатели в диспетчере вызываются не одновременно, а по очереди. Пока весь нижележащий стек слушателя не будет выполнен, управление не возвращается в диспетчер для вызова следующего слушателя. Если вам нужно выполнить обновление после всех слушателей, используйте отложенный вызов setTimout. (Как вариант)
__________________
Дети не должны знать о своих родителях

Старый 12.06.2018, 20:20
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 13  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от robotR2D2 Посмотреть сообщение
…а в том же OpenFl "дед" получит только "removed"
А вот AS3 не берет на себя ни мороку, ни право решать, нужно ли все же "деду" помимо всего еще и "added" получать. Ведь взрослый бородатый кодер сам может прервать дальнейшую обработку любого события, если сочтет необходимым.
__________________
Поймай яблоко 2!

Старый 13.06.2018, 20:11
RedHead90 вне форума Посмотреть профиль Отправить личное сообщение для RedHead90 Найти все сообщения от RedHead90
  № 14  
Ответить с цитированием
RedHead90

Регистрация: Apr 2018
Сообщений: 42
Цитата:
Однако событийная система такова, что к слушателю "фразы" прилетают рандомно.
Если бы они прилетали рандомно, то выполняя один и тот же код, мы получали бы всегда разный и непредсказуемый результат. Но это не так. И в твоих примерах слушатели вызываются именно в том порядке, в каком ты отправляешь события. То, что ты ожидаешь другого порядка говорит не об "изъяне событийной модели", а о том, что ты просто не понимаешь, как это работает.

Старый 14.06.2018, 01:47
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 15  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
Цитата:
Сообщение от RedHead90 Посмотреть сообщение
Если бы они прилетали рандомно, то выполняя один и тот же код, мы получали бы всегда разный и непредсказуемый результат. Но это не так.
Вот это поворот!
"Может он имел ввиду, что события вкладываются один в другого, да и в теме написано? Да не, он действительно думает, что объекты отбиваются от орд случайно генерируемых FP 'по фану' событий"

Цитата:
Сообщение от RedHead90 Посмотреть сообщение
То, что ты ожидаешь другого порядка говорит не об "изъяне событийной модели"
О, как... В первом посте есть вариант событийной модели, где этот изъян устранен. Но зачем читать? Особенно в теме с тегом "алгоритмы". Зачем отвечать по существу? Нужно просто вставить свои 5 копеек.
Разумеется, в тех вариантах свои изъяны. Но это не отменяет того факта, что изъяны существуют.

Цитата:
Сообщение от RedHead90 Посмотреть сообщение
ты просто не понимаешь, как это работает.
Конечно, до тебя ни разу в жизни не слышал ни про однопоточность, ни про стек вызовов. Но ты - добрая душа, и не позволил мне жить во тьме мракобесия.

Старый 14.06.2018, 02:37
RedHead90 вне форума Посмотреть профиль Отправить личное сообщение для RedHead90 Найти все сообщения от RedHead90
  № 16  
Ответить с цитированием
RedHead90

Регистрация: Apr 2018
Сообщений: 42
robotR2D2, Ну ты же сам написал, что события распространяются "абы как". А сейчас пишешь, что они распространяются так, как попадают в стек. Это же не "абы как". Мне самому во многом не нравится флешевская событийная модель. Преимущественно из-за строковых типов событий и также по той причине, что ты здесь описал. Но это не изъян, просто это сделано так, как сделано. Всем не угодишь. Вот то, что в OpenFl, который ты привел, события будут вызываться по разному в зависимости от таргета - вот это изъян. А во флеше все предсказуемо и логично. То, что оно работает не так, как тебе надо, не значит, что оно работает плохо.

По существу могу сказать, что в свое время я реализовывал фичу с упорядоченным распространением событий через очередь. Ничего более толкового придумать тогда не смог, да и работает вроде бы не плохо.

Код на Haxe:

Код AS3:
    public function dispatch(event:EVENT) {
        if (_isDispatching) {
            _queue.push(event);
        }
        else {
            _isDispatching = true;
            while (event != null) {
 
                var next = _head;
 
                while (next != null) {
                    var listener = next.listener;
                    next = next.next;
 
                    if(listener.enabled) {
                        switch (listener.comparisonMethod) {
                            case ListenerFlags : if ((event.bitmask & listener.bitmask) == listener.bitmask) listener.handler(event);
                            case EventFlags : if ((event.bitmask & listener.bitmask) == event.bitmask) listener.handler(event);
                            case AnyFlags : if ((event.bitmask & listener.bitmask) > 0) listener.handler(event);
                        }
                    }
 
                    if (listener.isDestroyed) removeListener(listener);
                }
 
                event = _queue.shift();
            }
            _isDispatching = false;
        }
    }
 
    public function dispatchChain(chain:Array<EVENT>) {
        for (event in chain) _queue.push(event);
        if (!_isDispatching) dispatch(_queue.shift());
    }

Старый 14.06.2018, 03:36
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 17  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
Помимо "абы как" я еще привел ряд примеров, конкретизирующих это "абы как". Например, случай, когда дед узнает о существовании правнука, а уже потом о внуке. И подобное я считаю изъяном. Даже с учетом того, что система программировалась с пониманием подобного недостатка.
Ранее я уже акцентировал, что мне интересно улучшение существующего алгоритма, я не ставлю задачу втоптать его в грязь.

Приведенный пример - это как раз вариант реализации предложения №2 из первого поста. И он таки тоже имеет изъян... Идея в принципе, а не конкретно твоя реализация. Тот кто запускает dispatch - не может быть уверен, что событие распространилось в теле метода-вызова, а это может быть местами критично.
Я в целом склоняюсь к реализации и классических событий, и вот таких - отложенных.

Старый 14.06.2018, 04:02
RedHead90 вне форума Посмотреть профиль Отправить личное сообщение для RedHead90 Найти все сообщения от RedHead90
  № 18  
Ответить с цитированием
RedHead90

Регистрация: Apr 2018
Сообщений: 42
Цитата:
Тот кто запускает dispatch - не может быть уверен, что событие распространилось в теле метода-вызова, а это может быть местами критично.
Такое будет только если пользователь сам каким-то образом остановит распространение всех событий в очереди. Так будет, какой-бы подход ты не использовал. В обычном случае же последующий код не будет вызван, пока dispatch не пройдет по всем слушателям всех событий в очереди, а значит можно быть уверенным, что событие распространилось.

Старый 14.06.2018, 05:18
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 19  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
Тут дело не в последовательности доставки событий. Это как раз решено. Проблема в том, что неизвестно, когда именно событие будет доставлено. Пример (если я понял твою реализацию правильно):
Код AS3:
var dispatcherFirst:YourCustomDispatcher = new YourCustomDispatcher();
dispatcherFirst.adEventListener("first", onFirst1);
dispatcherFirst.adEventListener("first", onFirst2);
 
var dispatcherSecond:YourCustomDispatcher = new YourCustomDispatcher();
dispatcherFirst.adEventListener("second", onSecond);
 
var x:int = 0;
 
dispatcherFirst.dispatch(new Event("first"));
 
function onFirst1(e:Event):void {
	dispatcherSecond.dispatch(new Event("second"));
	trace(x); // Output: 0 Expected: 5
}
 
function onFirst2(e:Event):void {
	// any
}
 
function onSecond(e:Event):void {
	x = 5;
}

Старый 14.06.2018, 11:51
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 20  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Не понял прикола. Почему не известно, когда событие будет доставлено, если оно будет доставлено тогда, когда к нему подберется стек? И в данном случае
Код AS1/AS2:
var dispatcherFirst:EventDispatcher = new EventDispatcher();
            dispatcherFirst.addEventListener("first", onFirst1);
            dispatcherFirst.addEventListener("first", onFirst2);
 
            var dispatcherSecond:EventDispatcher = new EventDispatcher();
            dispatcherSecond.addEventListener("second", onSecond);
 
            var x:int = 0;
 
            dispatcherFirst.dispatchEvent(new Event("first"));
 
            function onFirst1(e:Event):void {
                trace('onFirst1');
                dispatcherSecond.dispatchEvent(new Event("second"));
                trace(x); // Output: 0 Expected: 5
            }
 
            function onFirst2(e:Event):void {
                trace('onFirst2');
            }
 
            function onSecond(e:Event):void {
                trace('onSecond');
                x = 5;
            }
нам вернет, как и ожидается,
Код:
[trace] onFirst1
[trace] onSecond
[trace] 5
[trace] onFirst2
__________________
while(live()) { hope(); }

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:38.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.