setTimeout в отдельном потоке?

GrayHound

Новичок
setTimeout в отдельном потоке?

собственно примерный код:
PHP:
function main()
{
  function first();
  function second();
}
function first()
{
   if (expression) {
     setTimeout('first()', 0)
   } else {
     return;
   }
}
function second()
{
   if (expression) {
     setTimeout('second()', 0)
   } else {
     return;
   }
}
как оказалось функция из setTimeout запускается в отдельном потоке, т.е. после первое же обработки first() начинает обрабатываться сразу и second(). В итоге получается что обе эти рекурсии работают одновременно, до тех пор пока условия выполняются.

Хотелось бы чтобы сначала отработала рекурсия для first(), потом для second()
Вызывать функции без setTimeout не предлагать.
Может как то тут setInterval задействовать? Хотя он вроде тоже в отдельном потоке. Это вообще лечится?
 

kruglov

Новичок
Ну дык вместо return в first() запускайте second(), какие проблемы, не пойму.
 

ksnk

прохожий
GrayHound Возможно, вот такой код вызовет еще один всплеск удивления ;)
Код:
function first(){alert('Hello');}
var i=1000000; // поставить нужное значение, чтобы не раздражало...
setTimeout(first,0);
while(i--){};
alert('Oops!');
Участок javascript кода непрерываем и неделим, за исключением всяких confirm'ов и alert'ов, попадающихся внутри.
Вернувшись к первому тексту, видим, что после обработки всего участка (от <script> до </script>) у нас остались 2 таймаута, которые вызываются в дальнейшем по очереди...
 

dimagolov

Новичок
Re: setTimeout в отдельном потоке?

Автор оригинала: GrayHound
Вызывать функции без setTimeout не предлагать.
А в чем сокраментальный смысл вызова setTimeout (func, 0); ? чем это отличается от просто рекурсии?
 

GrayHound

Новичок
dimagolov, а ты попробуй это сделать если нужно реализовать движение какого-либо элемента вёрстки, он сразу перелетит при обычной рекурсии. Даже если стоит 0 у таймаута - движение заметней. Может у меня вкорне неверный подход к перемещению?

ksnk
Проще может просто тогда запустить цикл for на нужное количество шагов?
 

kruglov

Новичок
Дело в том, что изменения, производимые непрерывным потоком кода в javascript, накапливаются браузером, и в конце показывается конечный результат. Код, запущенный через setTimeout, идет в другой поток.

Но 0, конечно, маловато. Эдак у вас скорость анимации от быстродействия компа-браузера очень зависеть будет. Вроде как это тоже очевидно, как и мое предыдущее сообщение.
 

dimagolov

Новичок
рефреш экрана 100 гц. то есть чаще, чем раз в 10 милисикунд вообще ничего перерисовывать не нужно. Более того, перерисовывать имеет смысл чтобы приращение было минимум пару пикселей, то есть тут уже от скорости по экрану зависит.

И для анимации нафиг setTimeout не нужен, нужен setInterval чтобы не было зависимости от времени выполнения ф-ии отрисовки
 

GrayHound

Новичок
То что зависит от браузера/компа это ежу ясно. Наверное тестирую я во многих бразуерах последних и вижу что в IE всё летает, в других с притормозами.

Мне нужно сделать перемещение на размер всего экрана, за 6-10 шагов.
10мс - долго при таком, 0 даёт нужную задержку! То что нужно - человек увидит. Я не фильмы снимаю, где кадры важны. У меня не покадровая анимация - у меня перемещение, это две больших разницы.
 

dimagolov

Новичок
GrayHound
притормозы потому что проц ты пригружаешь своим setTimeout (,0) и броузер ничего не делает только пускает ф-ии setTimeout

Вспомни математику 3-го класса и физику 5-го, посчитай растояние в пикселях, которое надо пройти, время в секундах на это дело, размер шага (2-3 пикселя обычно нормально для не мелких картинок) и вычисли, с какой часторой (раз в секунду) надо делать отрисовки. Потом надо 1000 поделить на полученное значение и получишь значения 2-го параметра setInterval (а не setTimeout, обосновал выше)

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