PDA

Просмотр полной версии : sleep() возможно?


vg2k
01.03.2007, 18:03
Как я понял все задержки во флэше реализовываются через setInterval с вызовом функции.

У меня, наверное руки не оттуда растут, этот сетИнтервал так и не заработал... хоть примеров насмотрелся в инете и делал почти так же.

В любом случае бывают ситуации (у меня сейчас такая) когда алгоритм будет намного лучше смотреться и удобнее писать, если задержки будут НЕ ИМИТИРОВАТЬСЯ вызовом функций и НЕ разбрасывать один единый кусок кода по десятку callback функций.

то есть, например цикл:

for (i=0; i<n; i++)
{
// действия {}
sleep(5); // задержка 5 сек
}



Попытался это реализовать:

//////////////////////
// Это реализация sleep-a раз и на всегда
function sleep(time)
{
int_id = setInterval(sleep_empty_call, time);
}

function sleep_empty_call()
{
log_field.text += "sleep_empty_call()\r"; // для отладки присобачил
updateAfterEvent();
clearInterval(int_id);
}
//
//////////////////////

// это пример алгоритма
for(var i=0; i<5; i++)
{
log_field.text += i+"\r";
sleep(5);
}

В результате в log_field сначала вываливается все 5 циклов из
log_field.text += i+"\r";
потом спутся паузу все 5 циклов
log_field.text += "sleep_empty_call()\r";


Что не так ? нужна помощь.
То есть мне бы заставить не выполняться(приостановиться) алгоритм на X времени... а с setInterval алгоритм сразу продолжает выполняться и через указанное время абсолютно независимо стартует другая "инстанция", выполняющая callback функцию.



если через getTimer() , отказавшись от setInterval, брать время и гнать цикл:
do {} while (prev_time_stamp+sleep_time > getTimer())
то плеер начинает негодавать по поводу загрузки и кидается ноутисами с предложениями прекратить выполнение

etc
01.03.2007, 18:09
vg2k, для оформления кода есть теги . Оформите свой пост, как полагается.

vg2k
01.03.2007, 18:12
__etc, забыл.... поправился.

etc
01.03.2007, 18:21
Остановить выполнение цикла таким образом невозможно. Т.е. sleep во флеше нет. И приведенная ф-я sleep не является реализацией правильного sleep, это всего-лишь отложенное выполнение чего-либо.

vg2k
01.03.2007, 19:07
Остановить выполнение цикла таким образом невозможно
ТАКИМ.... а другим ? Запуск мувика-пустышки? Или... ?


Если не сложно, то попрошу продемонстрировать как в actionscript-ах будет выглядеть нижеприведенный алгоритм (написан "от болды"). Тут я при написании использовал свое понятие sleep :)
Может есть какие удобные оболочки для setInterval-a через которые заботиться об очистке не прейдется да и удобнее работать ?


// из хелпа генерация числа в диапазоне
function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}

function some_func()
{
sleep(randRange(1,3));
// действия
somevar = randRange(1,2);
switch(somevar)
{
case 1:
// действия
break;

case 2:
// действия
sleep(randRange(2,4));
break;
}
}

for (i=0; i<100; i++)
{
// действия
sleep(randRange(3,6));
if (i==5 || i==20 || i==34)
some_func(i);
// действия
sleep(randRange(5,9));
}

etc
01.03.2007, 19:12
Можно вообще прервать выполнение цикла соответствующими операторами. Возобновить его уже не получится.

А что было продемонстрировано, я не понял.
Под sleep я понял аналог подобной функции, например, в паскале, php. Т.е. остановка выполнения программы на заданный интервал.

CorC
01.03.2007, 19:17
выполнение кода нельзя прервать
а потом продолжить
можно лишь вызвать функцию через
определенное кол-во миллисекунд
по этому поводу уже писалось
многократно, и в поиске отражено :)

Cruser
02.03.2007, 13:31
function sleep(ms:Number)
{
var t:Number = getTimer();
while((getTimer() - t) < ms);
}

etc
02.03.2007, 13:57
Угу, при этом всё подвиснет наглухо, а по истечении 15 сек будет вывалено сообщение о бесконечном цикле.

this.create
02.03.2007, 20:37
for (i=0; i<n; i++)
{
// действия {}
sleep(5); // задержка 5 сек
}
var n:Number = 0;
var all:Number = 10;
var someInt:Number;
//
function someAction():Void {
if (n<all) {
trace('someAction '+n);
n++;
} else {
clearInterval(someInt);
}
}
//
someInt = setInterval(someAction, 5000);