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

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

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

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

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

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

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

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