Форум 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=118760)

fisherman 03.12.2008 09:01

Задержка в цикле
 
Такой вопрос, как правильно использовать setInterval в цикле, и в какое время производить очистку? Необходимо, чтобы в цикле выполнялась какая-то функция и задержка перед следующим шагом. Впрочем, если это покажут с помощью SetTimeout, никаких претензий, лишь бы было видно работу задержек)

silin 03.12.2008 09:44

Код AS3:

var timer:Timer=new Timer(0);
timer.addEventListener(TimerEvent.TIMER, loopBody);
timer.delay=500;
timer.repeatCount=5;
timer.start();
 
 
function loopBody(e:TimerEvent):void {
        var i:int=Timer(e.target).currentCount;
        trace( "i : " + i );
}


fisherman 03.12.2008 15:17

Хотелось бы тоже так хитрить, ну или скажем этак:
Код AS3:

private function Compl(evt:TimerEvent):void 
{
        timer.reset(); //что вобщем-то не обязательно       
        if(i!=30)
        {
        //тут какая угодно функция
        i+=1;
        timer.start();                               
        }
}
 
public function timeShift():void //вызов, допустим на клик
{
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, Compl);
        //какая угодно функция
        timer.start();
 
}

Все это, конечно, хорошо, но хотелось бы увидеть элементарный аналог допотопного delay(), который будет работать и с for и с foreach. А эти наши с вами увертки не универсальны, и поэтому прошу еще раз, ежели вам не трудно, подумать над вопросом, или покопатся в своих программах с готовым решением оного)
Спасибо

ZlPredator 03.12.2008 15:40

Флеш плеер работает с одним thread'ом. Поэтому, если бы можно было остановить выполнение (например, с помощью delay), то вы бы остановили полностью флеш (включая прорисовку), а не только свой код (это можно было бы обойти используя синхронизацию, но она слишком усложняет модель, поэтому в скриптах практически не используется).
Флеш построен по модели событий, вот их и используйте.

fisherman 04.12.2008 08:53

я уже использовал слушатель, но ориентировать подобный метод на циклы for и foreach не получается, вообще говоря, я подумываю о реализации через setInterval или setTimeout, но пока что моих навыков не хватает, что бы его вовремя ставить и вовремя чистить в цикле, поэтому я и прошу помощи в данном вопросе. Теперь о delay. Да, можно много размышлять на тему о том, как работает флэш, и как это непохоже на базовые языки программирования, но задержка выполнения конкретной функции это же не новость (собственно setInterval и setTimeout именно этим и занимаются), так почему бы их не использовать в решении таких проблем? Нет, может, конечно, для вас это и не кажется сложным, но пока примеров нужного мне кодя я не нашел.

silin 04.12.2008 14:25

>> но пока примеров нужного мне кодя я не нашел

и врядли найдешь, поскольку абсолютно чуждо это флешу
реализовать то, что ты хочешь, не сложно, но реально это не имеет смысла, почему - уже объяснил ZlPredator
Код AS3:

for (var i:int = 0; i < 3; i++) {
        delay(1000);
        trace( "i : " + i+" : "+getTimer() );
}
 
function delay(val:int):void {
        var t:int=getTimer();
        while (getTimer() - t < val);
 
}


fisherman 04.12.2008 21:46

Так, давайте-ка проясним еще раз чего я хочу, и что мне объясняют. Т.е. задержка функции в циклах for и foreach, это по вашему "абсолютно чуждо флэшу"? Проще говоря никто так не делает? А как тогда программы пишут, я не пойму? Или вы к допотопному delay прицепились, и не поняли, что от вас человек хотел?)

_Smirnoff 04.12.2008 21:52

"абсолютно чуждо флэшу" -Да; обновление экрана не произойдет, пока не выполнится последняя строка кода.

silin 04.12.2008 22:07

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

fisherman 04.12.2008 23:16

Если мы будем задерживать выполнение какой-то функции (используем setTimeout/setInterval) в каждом шаге цикла foreach, работа с интерфейсом во время работы цикла будет невозможной?
А если функция рисует какой-то граф. примитив, то программа нам не будет показывать прорисовку этих примитивов друг за другом с задержкой, а выдаст конечное изображение?
Судя по документации, setTimeout/setInterval для функции не должна влиять на выполнение других функций, не зависимых от неё. Все остальные функции будут выполнятся параллельно с задержкой. Так почему же должны возникнуть проблемы с интерфейсом? Мы же не стопим все)


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

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