PDA

Просмотр полной версии : Прерывания функций


port
24.05.2008, 13:54
Здравствуйте. Есть необходимость в прерыватели тех или иных действий (в частности загрузки).

Есть несколько MovieClip при клике на которых (onRelease) происходит обращение к xml, где хранятся адреса изображений, с последующей их погрузкой с одну и туже область(в качестве неё используется набор уже существующих MovieClip). При клике на разные MovieClip подгружаются разные виды изображений. Количество подгружаемых изображений при каждом клике около 1000. И если часто и быстро кликать по MovieClip, не дожидаясь завершения прежней загрузки, ролик начинает тормозить и загружать изображения с опозданиями. Примерный код:


xmlImage = new XML();
xmlImage.ignoreWhite = true;
xmlImage.load("xmlImageAddress.xml");
xmlImageList = new XML();
xmlImage.onLoad = function() {
xmlImageList = xmlImage.firstChild.childNodes;
for (count=0; count < xmlImageList.length; count++){
_root[‘mc’ + count].number = count
_root[‘mc’ + count].onRelease = function(){
for (secondCount=0; secondCount <1000; secondCount ++) {
_root[‘mcImage’+ secondCount].loadMovie(xmlImageList[this.number].childNodes[secondCount].firstChild);}
}
};
};
};

Где:

xmlImageAddress.xml – файл с адресами изображений;
mc – MovieClip'ы, при клике на которые происходят события загрузки;
count – счетчик с максимальным значением, равным количеству видов изображений;
secondCount – счётчик используемый при загрузке 1000 изображений того или иного вида;
number – переменная в которой хранится порядковый номер вида изображения;
mcImage – MovieClip’ы , заранее существующие, в которые подгружаются изображения того или иного вида.


Необходимо, чтоб при каждом событии onRelease предыдущая загрузка и обращения к xml прерывались и запускалось новая. Заранее благодарен.

Alex_beginner
24.05.2008, 14:27
Есть у меня смутные мысли, что тут нужно использовать исключения, т.е. такие вещи как throw и класс Error. Хотя я могу ошибаться.

iNils
24.05.2008, 14:44
Класс XML, единственный класс, загрузку у которого прервать нельзя, load (null) не помогает и файлы грузятся до конца.
Можно конечно подписывать onLoad через Delegate, а потом писать
xml.onLoad = null;
delete xml;
и начинать новую загрузку. НО у IE и FF одновременно может грузиться только два потока, а как я сказал выше загрузку XML прервать нельзя, поэтому сколько бы вы не отписывались, до тех пор пока предыдущие xml не загрузятся, новые грузится не будет.
К примеру нажмем 20 раз, запустим 20 загрузок, но грязятся только первые два. Как только один из них загрузился, пошел 3, потом 4 и тд. Но если первые грузились долго, то к 20-ой может быть таймаут и соединение будет разорвано и в результате, самую последнию и актуальную загрузку вы не получите.

Кто-то тут делал ход конем и грузил через javascript, так как js нормально загрузку xml убивает, а потом вроде из кеша брал. Но эта схема весьма сложная, и я бы не сказал, что надежная. Но иначе только блокировать кнопку загрузки на время самой загрузки.

port
25.05.2008, 11:27
Спасибо за подробное описания. Не мог ли бы вы подсказать, как должна выгледить функция, которая служила бы своебразным прелоудером и чтоб цикл

for (secondCount=0; secondCount <1000; secondCount ++) {
_root[‘mcImage’+ secondCount].loadMovie(xmlImageList[this.number].childNodes[secondCount].firstChild);}
}

не заканчивался ранее, чем загрузится последнее изображения. AS выполняется вроде асинхроно и если не поставить такого прелоудера на этот цикл, изображения будут грузится одно за другим, а события прописаные после цикла - например, разблокирование всех кнопок загрузки после окончаниязагрузки изображений - будут выполнятся внезависимости от того, они загрузились или нет. Заранее благодарен. И ещё раз спасибо за описание.

DarkLight
25.05.2008, 13:21
Вместо loadMovie, который давно устарел, используйте MovieClipLoader. Там есть обработчики onProgress и onLoadInit, куда и можно прописать отображение прелоадера с % и реактивацию кнопок соответственно. Пример нормальный есть во флешовом хелпе, да и на форуме много раз обсуждалось, можно найти

port
25.05.2008, 14:21
Вместо loadMovie, который давно устарел, используйте MovieClipLoader.

Спасибо за ориентир - буду искать и смотреть. Если же возникнет (найдется / вспомнится) набросок MovieClipLoader в контексте примера очень схожим с моим :

for (secondCount=0; secondCount <1000; secondCount ++) {
_root[‘mcImage’+ secondCount].loadMovie(xmlImageList[this.number].childNodes[secondCount].firstChild);}
}

пишите или скидывайте ссылки. Заранее благодарен и ещё раз спасибо за ориентир.