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

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

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

Регистрация: Mar 2013
Сообщений: 290
Wolsh, аа вот оно что, а я думал глаголы в камментах этого форума )))

Ок, учтём.

Старый 05.08.2013, 09:24
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 12  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Оппа. А эта программа (как оказалось) работает не правильно.

Она три раза подряд выдает третье изображение.
Я даже подозреваю, что все три элемента массива содержат третье изображение.

Опять какие-то мутно-уловимые асинхронные штуковины?

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

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А чего Вы ждали, у Вас же один Лоадер сохраняется в приватной переменной, последний из создаваемых в цикле. Или Вы думали, что одна переменная будет хранить все три Лоадера в себе?))
Соответственно в обработчике Вы у этого последнего Лоадера и забираете то что он загрузил, независимо от того, какой Лоадер на самом деле послал событие COMPLETE:
Код AS3:
BitData = Bitmap(imageLoader.content).bitmapData;
А надо
Код AS3:
BitData = Bitmap(e.currentTarget.content).bitmapData;
и приватная ссылка вобщем-то не нужна.
__________________
Reality.getBounds(this);

Старый 05.08.2013, 12:26
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 14  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Wolsh, благодарю за багфикс, теперь все три картинки выводятся.

Цитата:
А чего Вы ждали, у Вас же один Лоадер сохраняется в приватной переменной, последний из создаваемых в цикле.
Или Вы думали, что одна переменная будет хранить все три Лоадера в себе?))
Хм, всё-равно что-то я не до конца просекаю фишку.

Рассмотрим по итерациям.
1. i = 0, Создаем экземпляр imageLoader, Грузим в него "text1.png", Запускаем слушатель.
2. Выходим из цикла for. В переменную BitData записываем картинку text1.png, Перекидываем ее в BitItem.
3. Засовываем его в PicArray[0], Наращиваем переменную индекса массива.
4. Возвращаемся в цикл for, получаем i = 1, повторяем.

Я же успел значение text1.png засунуть в массив!
И при следующей итерации, то же должно произойти с text2.png...

Цитата:
Или Вы думали, что одна переменная будет хранить все три Лоадера в себе?))
Ээ, ну она временно хранит один лоадер, и успевает передать его в массив. Или не успевает?

Цитата:
Соответственно в обработчике Вы у этого последнего Лоадера и забираете то что он загрузил,
независимо от того, какой Лоадер на самом деле послал событие COMPLETE:
Код AS3:
BitData = Bitmap(imageLoader.content).bitmapData;
Странно, а разве на каждой итерации не должен происходить выход из цикла for в слушатель?
Я предполагал, что либо этот выход происходит каждый раз, и я успеваю засунуть значение в массив.
Либо же, как-то асинхронно запустяццо три слушателя, и каждый (уже сложнее представить такое, лол) как-то разрулит ситуацию сам, ведь он успел получить соответствующую ему строку.

Цитата:
А надо
Код AS3:

BitData = Bitmap(e.currentTarget.content).bitmapData;
Эта строка мне понятна чисто технически: она более точна и берет данные от экземпляра текущего события.
Однако почему она не равнозначна той записи (по указанным выше моментам), не очень понятно.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Ээ, ну она временно хранит один лоадер, и успевает передать его в массив. Или не успевает?
А где там передача Лоадера в массив? О__о
Цитата:
Странно, а разве на каждой итерации не должен происходить выход из цикла for в слушатель?
На каком основании? Слушатель потому так и называется, что слушает. То есть ждет, когда случится событие. И будет вызван, только когда картинка загрузится. А цикл... сто тысяч итераций цикла пролетит за десять миллисекунд. Картинка не то что загрузиться не успеет, запрос еще до сервера не дойдет.
Учите основы. Читайте главы про событийную модель. Если нужно, пейте кофе.
Цитата:
Однако почему она не равнозначна той записи
В той записи у Вас одна переменная, которая может хранить только одну ссылку на Лоадер. Поскольку цикл отработал еще до того как сервер понял что его о чем-то спрашивают, в этой переменной ссылка только на последний созданный Лоадер (остальные может еще существуют, но по правилам их должен был съесть СборщикМусора, ибо ссылок на них не осталось). В записи через таргет же Вы обращаетесь именно к тому Лоадеру, который послал событие, загрузив картинку.
__________________
Reality.getBounds(this);

Старый 05.08.2013, 15:18
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 16  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Вот оно как, картина начинает проясняться.

Хотя некоторые сомнения всё-таки остаются.
Например, если сборщик мусора сжирает первые две инициации initListener, тогда, вроде как и эта строка
Код AS3:
BitData = Bitmap(e.currentTarget.content).bitmapData;
не должна помогать, потому что двое первых e.currentTarget.content уже были "сожраны лангоньерами".
Впрочем, не хочу отвлекать вас лишний раз, нужно перечитывать главу Мука про события.
Тем более, что кофе пока вне доступа, да к тому же еще и понедельник : )

Хотелось бы, разве что, обратить внимание на вот этот фрагмент:

Цитата:
и приватная ссылка вобщем-то не нужна.
Если я всё правильно понял, то:

Код AS3:
private var imageLoader:Loader;
нужно заменить на введение локальной переменной цикла:
Код AS3:
for(var i:uint = 0; i < 3; i ++ )
			  	{
					var imageLoader:Loader;       //добавлено
 
					imageLoader = new Loader();
					imageLoader.load( new URLRequest("text" + String(i + 1) + ".png" ) );
					imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, initListener);
 
				}
Я протестировал - оба варианта работают.

И можно отметить интересный ньюанс:
В изначальном варианте, порядок вывода картинок такой:
Вторая, Третья, Первая. (похоже, это зависит от размеров файлов: 39Кб, 34Кб, 31Кб)

В исправленном варианте, порядок вывода картинок такой:
Третья, Первая, Вторая. (здесь принцип непонятен).

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А порядка и не будет, тем более с такой маленькой разницей в весе. Там слишком много факторов влияют, особенно в сети (да и при чтении с диска есть моменты))). Если важен порядок, надо использовать последовательную, а не параллельную загрузку (то есть грузить в один лоадер, каждую следующую загрузку начинать только после завершения предыдущей).
Локальная переменная — да, я имел в виду ее. Обратите внимание, ссылка опять вроде бы нигде не сохраняется. Возможно, у работающих Лоадеров просто иммунитет — честно, не задавался этим вопросом.
__________________
Reality.getBounds(this);

Старый 05.08.2013, 17:37
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 18  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
У Мука в книге кстати был не Event.Complete, а Event.Init, там правда один файл грузился.
Может имунны лоадеры у которых комплит, а у которых инит нет, но это надо отдельно смотреть.

Ок, понятно. Заносим "последовательная загрузка" в ToDo List.

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

Регистрация: Aug 2013
Сообщений: 56
Цитата:
Хотя некоторые сомнения всё-таки остаются.
Например, если сборщик мусора сжирает первые две инициации initListener, тогда, вроде как и эта строка
Код AS3:
BitData = Bitmap(e.currentTarget.content).bitmapData;
не должна помогать, потому что двое первых e.currentTarget.content уже были "сожраны лангоньерами".
Вы не поняли в чем фишка. Вы сами каждую итерацию цикла перезаписываете переменную imageLoader на новую, так что в конце цикла она хранит ссылку на третий объект. Загрузка файлов работает асинхронно, она не задерживает остальной ход работы программы. Вот и получается что у вас работает так:
Код:
>Цикл отработал initListener == ссылке на последний лоадер. Загрузки начались. 
>>... прошел некий отрезок времени
>Файлы загрузились.
Цитата:
Я протестировал - оба варианта работают.
Оба и будут, но в случае с глобальной приватной переменной у вас остается лишняя ссылка на последний лоадер.

Порядок не зависит от размера файла, кто первый загрузился того и тапки. Конечно первый чаще загружается самый маленький, но при таком маленьком разбросе в размерах, как у вас, это может быть какой угодно файл.
P.S. Про порядок вижу вам уже ответили пока я пост писал.
P.P.S. Если по хорошему, то в вашем случае глобальная переменная класса нужна только одна - массив со ссылками на загруженные картинки. (у вас PicArray)

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

Регистрация: Mar 2013
Сообщений: 290
Котейка, извиняюсь что туплю, но главу Мука я еще не перечитывал, поэтому...

Цитата:
Цикл отработал initListener == ссылке на последний лоадер. Загрузки начались.
Если это так, то вот этот багфикс от Wolsh: e.currentTarget.content тоже тогда не должен работать!
Ведь currentTarget.content всегда равен ссылке на последний лоадер, и всё равно должна только третья картинка отображаться : )
Как же тогда currentTarget получает различные значения?

Цитата:
P.P.S. Если по хорошему, то в вашем случае глобальная переменная класса нужна только одна - массив со ссылками на загруженные картинки. (у вас PicArray)
Мм, что значит глобальная переменная класса, вы наверное имеете ввиду, что:
Код AS3:
            private var imageCounter:uint = 0; //убрать под шконку
			private var imageLoader:Loader;  //убрать под шконку
 
			private var BitData:BitmapData;  //убрать под шконку
			private var BitItem:Bitmap;        //убрать под шконку
 
			private var _picArray:Array; //сделать public, а не private
 
                        ...
Хотя, что это меняет, в чем заключается "по хорошему" при такой реализации, не очень понятно.

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

Теги
array , loader as3 , загрузка , Изображения , массив
Опции темы
Опции просмотра

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

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


 


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


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