Форум 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 для функции не должна влиять на выполнение других функций, не зависимых от неё. Все остальные функции будут выполнятся параллельно с задержкой. Так почему же должны возникнуть проблемы с интерфейсом? Мы же не стопим все)

musat 05.12.2008 00:35

На примере for (с помощью setTimeout):
Код AS3:

var i:int;
for (i=0; i<5; i++) {
    setTimeout(func, 1000 * i, i);
}
 
function func(arg:int):void {
    trace(arg);
}

А вообще в AS3 рекомендуется заместо setInterval и setTimeout использовать класс Timer. Если надо по таймеру передать параметры, надо написать класс, расширяющий класс Timer, и добавить свойство, например, data, а потом в обработчике его забирать.

silin 05.12.2008 00:46

все верно
Если мы будем задерживать выполнение какой-то функции (используем setTimeout/setInterval) работа с интерфейсом и остальная деятельность плеера не нарушится, документация тебя не обманывает :)
но вернутся в точку вызова ты уже не сможешь - цикл отработал (запустил с задержкой твои функции) и все..

fisherman 05.12.2008 07:19

Ну вот и разобрались:) Есть только одна проблема.. получается, задержек в работе цикла не будет. Т.е. функции запустятся, и их выполнение никак не отменить. А как можно задержать цикл перед шагом(в конце предыдущего шага), чтобы функция успела выполниться, но так, чтобы не нагрузить систему(я подумывал о еще одном таймере в функции и while.. от таймера и таймаута, работающих одновременно, комп не будет в шоке, а вот while меня несколько настораживает) Если можно так сделать, то пользователь сможет отменить вычисления, что очень важно, потому как он будет иметь возможность задать скорость счета.
Какие мысли на этот счет?

silin 05.12.2008 09:37

по третьему кругу пошло, однако..
циклы for в такой задачке не при делах вовсе
см. пример из поста #2, в обработчике таймера(loopBody) меняй задержку следующей итерации, отменяй вовсе или что-там еще нужно в зависимости от действий пользователя или еще каких условий

iNils 05.12.2008 11:33

http://www.flasher.ru/forum/showpost...74&postcount=6
Тут пример, правда не на as3, разноса цикла по кадрам.


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

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