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

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

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

Регистрация: Feb 2009
Сообщений: 141
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Если экземпляр класса, в котором находится обработчик, будет собран сборщиком мусора, то при прохожении события вылетит ошибка обращения к объекту null
Если экземпляр класса, в котором находится обработчик, будет обработан сборщиком мусора, то он не удалит экземпляр этого класса, так как обработчик является ссылкой на этот экземпляр, поэтому ошибка никакая не вылетит, а если будет установлен флаг weekReference, то GC удалит ссылку и обработчик не будет вызван, а объект будет удален без всяких ошибок.

А вот сам факт, что экземпляру EventDispatcher пофиг на то, в каком экземпляре его подписывают и посылает событие даже в те экземпляры, которые уже отписались от его события весьма странен.

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
А вот сам факт, что экземпляру EventDispatcher пофиг на то, в каком экземпляре его подписывают и посылает событие даже в те экземпляры, которые уже отписались от его события весьма странен.
Это не факт, это Ваше неверное предположение.
__________________
...вселенская грусть

Старый 06.03.2013, 00:42
Vreden вне форума Посмотреть профиль Отправить личное сообщение для Vreden Найти все сообщения от Vreden
  № 13  
Ответить с цитированием
Vreden
 
Аватар для Vreden

Регистрация: Feb 2009
Сообщений: 141
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Это не факт, это Ваше неверное предположение.
Возникло такое ощущение, что вы знаете что-то, чего не знаю я, но не за какие коврижки не хотите раскрывать тайну.

Старый 06.03.2013, 00:45
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 14  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Я знаю только что если Вы от события отписались, то получать Вы его не будете.
__________________
...вселенская грусть

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

Регистрация: Feb 2009
Сообщений: 141
А если я от него отписался, но подписался в другом экземпляре класса, первый не должен продолжать получать событие, так?

Старый 06.03.2013, 01:06
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 16  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Да, все верно. Попробуйте провести эксперимент - создайте 2 Shape'а и подпишите их на Event.ENTER_FRAME. И отпишите. И потом по очереди подписывайте/отписывайте. Поймать какой именно Shape получил событие можно через свойство события target.
Уверен, что в итоге Вы убедитесь, что после отписки событие перестает обрабатываться.
__________________
...вселенская грусть

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

Регистрация: Feb 2009
Сообщений: 141
Я в этом уверен изначально.
Но только есть разница между экспериментом и исходником выше, в случае с шейпами, я буду подписыватсья на два разных объекта, а в моем случае я подписываюсь к одному и тому же объекту разными объектами. По идее это не должно иметь значения, просто к слову о разнице. Но у меня как-то так получилось. Вобщем никак не могу найти где я накосячил, но тем не менее из примера видно, что после отписи экземпляр продолжает обрабатывать событие, а после отписи конкретно данный экземпляр далее нигде не подписывается на это событие.


Последний раз редактировалось Vreden; 06.03.2013 в 01:32.
Старый 06.03.2013, 02:55
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 18  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Есть у меня теория по поводу происходящего. Опирается она на то, что controls.images у вас один на всех, и что при локальном тестировании загрузка происходит практически моментально, и поэтому объекты ловят события по несколько раз, прежде чем успевают отписаться.

Ошибка в том, что все экземпляры слушают Event.COMPLETE, но никто не знает, как отличить событие, вызванное загрузкой своих данных, от остальных точно таких же событий. Поэтому на завершение загрузки для одного экземпляра реагируют сразу все.

В итоге происходит следующее:

1. Вы в цикле добавляете на сцену n экземпляров DeathImage. Каждый экземпляр подписывается на Event.COMPLETE у controls.images и запускает загрузку.

2. Завершается загрузка, вызванная 1м экземпляром; controls.images посылает Event.COMPLETE, который ловят ВСЕ экземпляры DeathImage. В очередь исполнения попадают __imagesLoadComplete всех экземпляров.

3. Начинает исполняться __imagesLoadComplete 1го экземпляра. Пока он исполняется, завершаются загрузки, вызванные остальными экземплярами. Каждая завершенная загрузка пуляет Event.COMPLETE, который кладет в очередь вызовов __imagesLoadComplete ВСЕХ ЭКЗЕМПЛЯРОВ КРОМЕ 1го (т.к. первый уже успел отписаться; это подтверждается тем, что "after 10" в трейсах выводится первым и встречается всего 1 раз).
Итого на момент завершения исполнения __imagesLoadComplete 1го экземпляра в очереди вызовов находится n вызовов __imagesLoadComplete для всех экземпляров кроме 1го (по 1 уже было, по n-1 добавилось только что) и n-1 для 1го (1й вызов только что отработал, n-1 добавились)

4. Исполняется по 1 вызову __imagesLoadComplete для каждого экземпляра DeathImage.
После этого все экземпляры отписаны от Event.COMPLETE, но в очереди УЖЕ ЛЕЖАТ оставшиеся n-1 вызовов __imagesLoadComplete для каждого экземпляра.

5. Для каждого экземпляра по очереди исполняются оставшиеся вызовы.

В реальных условиях, когда загрузка происходит не моментально, и вызовы __imagesLoadComplete, вызванные первым Event.COMPLETE, успеют отработать ДО следующего Event.COMPLETE, все экземпляры успеют от него отписаться, и остальные n-1 событий никто не поймает.
__________________
тонкий тролль, осеянный благодатью

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

Регистрация: Feb 2009
Сообщений: 141
Gaen, да, все именно так и происходит, браво, я что-то подобное подозревал, но сварить все в кучу в голове не получалось, теперь есть четкое объяснение происходящего.

На самом деле картинки я загружаю с удаленного сервера, поэтому в боевых условиях ситуация будет такая же. Проблему решил отдельным экземпляром image для каждого подписывающегося объекта, а соответственно для каждого теперь своя очередь, но статический Dictionary загруженных изображений. Правда у этого подхода есть парочка небольших минусов, но они терпимы по сравнению с тем, что было.

Такую дырень пришлось бы в любом случае закрывать, даже, если картинки грузились бы долго, т.к. в том случае, когда они уже в кеше браузера, им нужно совсем не много времени чтобы перекочевать в Dictionary.

В любом случае, Gaen, большое спасибо, вы помогли мне объяснить эту ситуацию и я теперь не буду мучаться в догадках.

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

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

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


 


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


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