Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Насильно перерисовать графику (долговыполняющийся код) (http://www.flasher.ru/forum/showthread.php?t=154385)

soulburner 16.04.2011 17:16

Насильно перерисовать графику (долговыполняющийся код)
 
Такой вопрос - есть некий кусок кода, который выполняется довольно долго и который невозможно разбить на итерации. Допустим, этот код содержится в методе calculate();

Как мне по-простому сделать, чтобы перед входом в этот код на экране изменился статус и этот экран перерисовался?

Т.е. я хочу сделать что-то такое:

Код AS3:

status.text = "Calculating... Please wait";
calculate();
status.text = "Done!";

На деле это приводит к подвисанию плеера а юзер видит только статус "Done!". Можно ли как-то после установки первого статуса сделать force redraw?

PS: Есть, конечно, вариант выставить статус и поставить запуск calculate() на лисенер ENTER_FRAME для след. фрейма. Но это как-то криво. Есть ли вариант попроще?

incoob 16.04.2011 18:19

Это вполне приемлемо в данном контексте.

soulburner 16.04.2011 19:12

Цитата:

Сообщение от incoob (Сообщение 989867)
Это вполне приемлемо в данном контексте.

Не очень. У меня уже и так туева хуча разныл лисенеров на ENTER_FRAME. Не хочется выставлять другой, флаги, восстанавливать старый после обработки и т.п.

Хотелось бы более красивого решения.

i.o. 16.04.2011 19:15

Цитата:

Хотелось бы более красивого решения.
хотите дальше.
по теме - делайте через события.

expl 16.04.2011 20:35

Можно было бы тупо взять конвеер Потапенко и не сильно размышляя об архитектуре загнать в него 3 действия:
Код AS3:

conveyor.add(setWaitText, "please wait...");
conveyor.addFrames(1);// Подождать один кадр
conveyor.add(doHardCalculation);
conveyor.add(setWaitText, "complete");

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

mikhailk 16.04.2011 20:37

Цитата:

На деле это приводит к подвисанию плеера а юзер видит только статус "Done!". Можно ли как-то после установки первого статуса сделать force redraw?
Аварийно:
отложите запуск calculate() на 50-100 мс
либо через таймер либо через setTimeout
FP успеет перерисовать экран и расчет запустится на новом экране

Правильно:
создайте объект, который нужно показать пользователю перед началом расчетов, на его событие ADDED_TO_STAGE повесьте слушателя, который и запустит вычисление

Добавлено через 6 минут
кстати, можно использовать и событие CHANGE текстового поля status
главное только потом отписаться сразу после запуска вычислений

soulburner 16.04.2011 21:24

Ясно, спасибо. Собственно, как я и подозревал - придется вешать listener'ы


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

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