Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Индикатор процесса вычисления (http://www.flasher.ru/forum/showthread.php?t=131264)

DubAlex 16.10.2009 06:45

Индикатор процесса вычисления
 
Есть следующий код:
Код AS1/AS2:

                for(j=0;y_koor+KVADRAT_SIDE<_root._height;j++)
                {
                  for(i=0;x_koor+KVADRAT_SIDE<_root._width;i++)
                  {       
                          n=n+1;
                        _root.attachMovie("kvadrat", "kvadrat"+n, n, {_x:x_koor,_y:y_koor});
                        x_koor=x_koor+KVADRAT_SIDE;
                  }
                  y_koor=y_koor+KVADRAT_SIDE;
                  x_koor=0;
                }

Код создает мелкие квадратики располагая их на холсте поочередно слева направо, сверху вниз. Если квадраты мелкие, а холст большой, то процесс получается повольно долгим.
Я знаю текущее количество созданных квадратиков
Код AS1/AS2:

current=n

и знаю сколько их должно быть в итоге
Код AS1/AS2:

total=(_root._width/KVADRAT_SIDE)*(_root._height/KVADRAT_SIDE)

.
Хочу отображать на экране процесс формирования квадратов в процентах:
Код AS1/AS2:

trace(current/total*100)

, но реально получаю другой результат - приложение подвисает, потом выходит служебное окно "Приложение работает слишком медленно. Прервать выполнение кода? Да/нет". Если нажимаю нет, то все мои trace'ы пачкой выводятся.
Я понимаю, что нужно ставить задержку во время выполнения, но не могу сообразить, как это сделать?

iNils 16.10.2009 12:29

1. Весь код в кадре, кроме описанных внутри обработчиков событий, выполняется в одном кадре.
2. Пока не выполнится весь код кадра, графически ничего не отображается.
3. Пока не выполнится весь код кадра, новый кадр не отобразится.
4. На отображение одного кадра отведен лимит в 15 секунд.
5. При превышении лимита показывается сообщение "Приложение работает слишком медленно. Прервать выполнение кода? Да/нет"

Итого: Вы создали цикл, код внутри которого не является обработчиком событий, поэтому, пока он не выполнится не будут показаны ваши квадратики, и не будет перехода на новый кадр, что вызывает сообщении о медленной работе.

Поэтому, цикл надо выполнять не весь за раз, по частям, вызывая следующий кусок либо через onEnterFrame или setTimeout/setInterval

point111 27.10.2009 18:51

может быть Flasm поможет? сам я им не пользовался, только читал:

Цитата:

Ограничения на время выполнения кода (15 секунд) и длину цепочки рекурсии (256 активаций) появились еще во времена Flash 5 ...
----------------- scip ----------------
... во Flash 7 в формат swf-файлов были внесены изменения. Одним из них стал тег scriptLimits, в котором прописываются соответствующие значения. К сожалению, пока нет возможности произвольным образом задавать время выполнения кода и длину цепочки рекурсии при публикации фильма. Компилятор среды разработки Flash всегда присваивает параметрам тега scriptLimits значения по умолчанию. Заменить их можно, только модифицировав swf-файл при помощи шестнадцатеричного редактора или воспользовавшись Flasm версии 1.51 и выше. Второй способ более простой, так как он не требует от вас знаний архитектуры swf-файла. Например, чтобы разрешить цепочки рекурсии до 1000 активаций и увеличить предельное время выполнения кода до 100 секунд, в сгенерированный Flashm ассемблер нужно добавить следующую строчку:

scriptLimits recursion 1000 timeout 100
from: http://dddcenter.narod.ru/book/flash/gursky/glava20.htm


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

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