Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Распределение во времени долговыполняющегося цикла (http://www.flasher.ru/forum/showthread.php?t=154709)

zorexundra 21.04.2011 11:04

Распределение во времени долговыполняющегося цикла
 
Здравствуйте! Помогите, пожалуйста.
Есть цикл:
Код AS3:

var мой_XMLListLength = мой_XMLList.length();
for (var i:int=0; i<мой_XMLListLength; i++) {
  trace(мой_XMLList[i]);
}

Этот цикл не успевает выполниться в отведённые ему 60 секунд.
Кто решал подобные задачи, подскажите, как распределить этот цикл во времени, что бы он смог выполниться полностью.

Волгоградец 21.04.2011 12:41

Это не сложно - как вариант - цикл должен находиться в обработчике ENTER_FRAME и в этом цикле отслеживать нужно текущее время, потраченное на выполнение этого цикла. Если оно больше определенного значения, то обрывать цикл, но запоминать текущую позицию. Затем при переходе на новый кадр возобновлять цикл с нужной позиции. По завершении - удалить ENTER_FRAMEю

zorexundra 21.04.2011 13:28

Волгоградец, Вы можете пояснить это кодом?

Может кто-то знает, как прерывать и возобновлять выполнение цикла по событию ошибки превышения времени исполнения скрипта (Ошибка 1502)?
Вариант с событием ENTER_FRAME почему-то кажется мне "стрёмным"...

Волгоградец 21.04.2011 14:08

Как то так
Код AS3:

var iterator:int = 00;
var lim:Number = 33;
 
addEventListener(Event.ENTER_FRAME, doCalc);
 
function doCalc(event:Event):void
{
        var t:Number = getTimer();
        for(var i:int = iterator; i < 10e6; i++)
        {
                if(getTimer() - t > lim)
                {
                        iterator = i;
                        return;
                }
 
                var s:String = '';
                s.split('');
        }
 
        iterator = 0;
        removeEventListener(Event.ENTER_FRAME, doCalc);
        trace('complete', getTimer());
}

Не нравится ентерфрайм - делай то же самое через setInterval, Timer и т.п.

zorexundra 21.04.2011 14:24

Спасибо за рабочий пример!
Волгоградец, а у Вас нет идеи как реализовать прерывание по событию Ошибки 1502.
Просто я заметил, перефразируя слова Того самого Мюнхгаузена: - Дело в том, что во Флеше и
на земле время летит не одинаково.

Волгоградец 21.04.2011 14:28

try catch

zorexundra 22.04.2011 10:43

Волгоградец, ещё раз спасибо! Это решило все проблемы, а именно:
Код AS3:

var мой_XMLListLength = мой_XMLList.length();
for (var i:int=0; i<мой_XMLListLength; i++) {
  try {
        trace(мой_XMLList[i]);
  } catch (e:Error) {
        i--;
  }
}

Кстати, это ответ и на эту тему - http://www.flasher.ru/forum/showthread.php?t=154238

Rundll 06.04.2012 19:40

Столкнулся с похожей проблемой, есть цикл который не успевает выполнить необходимые вычисления и вываливается ошибка сценария 1502. Я так понимаю, что вариант с обработчиком ENTER_FRAME относится к Flash CS в котором есть timeline, есть ли подобный трюк для Flash/Flex Builder?

FlashRus 06.04.2012 20:00

timeline это всего лишь панелька во Flash.
ENTER_FRAME будет работать везде.

Rundll 07.04.2012 01:07

Да, что-то я погорячился. А если мне необходимо вызвать предложенный метод с циклом из другого метода (т.е. есть код и предположим в середине кода вызывается функция с циклом, после чего предполагается использовать обработанные данные в следующем за вызванной функцией коде) будет ли работать данная конструкция? По идее должен получиться некий асинхронный вызов, но код за вызванной функцией не должен исполняться пока функцией не будут возвращены данные. Как быть?


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

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