Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Проблема с таймером


Автор: voronov 19.10.2006, 01:14
Проблема в следующем: необходимо создать 2 таймера вызывающих каждую секунду одну и ту же функцию но с разными параметрами
Пробовал так:
Код

function window.onload()
{

setInterval("f('a')",1000);

setInterval("f('b')",1000);

}

function f(param)
{
 window.status+=param;
}

но вместо ожидаемой в статусной строки: аbabab получаю abbaabba
В чем проблема? И если можно решить эту задачу по другому, то подскажите

Заранее спасибо за ответ

Автор: GoodBoy 19.10.2006, 10:02
сделай так:
Код
function window.onload() {
    setInterval("f('a')",1000);
    setTimeout("b()",500);
}

function b() {
    setInterval("f('b')",1000);
}

function f(param) {
    window.status+=param;
}


или ещё короче:

Код
function window.onload() {
    setInterval("f('a')",1000);
    setTimeout("setInterval('f(\"b\")',1000);",500);
}

function f(param){
    window.status+=param;
}


Автор: AKS 19.10.2006, 11:06
GoodBoy, 
Цитата

2 таймера вызывающих каждую секунду одну и ту же функцию но с разными параметрами

Автор: vasac 19.10.2006, 13:24
Код

window.onload = function() {
  setInterval( ( function()  { f( "a" ); f( "b" ); return true; } ), 1000 );
  return true;
}

?

Автор: voronov 19.10.2006, 16:29
Спасибо за ответы НО


Цитата

Код

window.onload = function() {
  setInterval( ( function()  { f( "a" ); f( "b" ); return true; } ), 1000 );
  return true;
}

Все бы хорошо, но мне нужны два разный идентификатора таймера (что бы завершать их по отдельности )

Цитата

Код

function window.onload() {
    setInterval("f('a')",1000);
    setTimeout("setInterval('f(\"b\")',1000);",500);
}

function f(param){
    window.status+=param;
}

Это я для примера привел, а по большому счету мне нужно каждую милисекунду вызывть функцию с разными параметрами 
Что вроде этого-т.е. создаем 4 таймера которые каждую 1млсек вызывают ф-цию f c соответсвующими параметрами
t1=setInterval("f('a')",1);
t2=setInterval("f('b')",1);
t3=setInterval("f('с')",1);
t4=setInterval("f('d')",1);



Автор: vasac 19.10.2006, 16:46
Может быть стоит пересмотреть логику внутри f() и ограничится одним таймером?

Автор: voronov 19.10.2006, 17:22
Цитата

Может быть стоит пересмотреть логику внутри f() и ограничится одним таймером? 


Я бы и рад, да боюсь что так не получится сделать

Автор: GIK 19.10.2006, 18:15
Цитата

Что вроде этого-т.е. создаем 4 таймера которые каждую 1млсек вызывают ф-цию f c соответсвующими параметрами

Если надо вызвать поочереди, с разными аргументами, то можно попробовать так:
Код

<html>
<head> 
<script>
var t1; var ee=new Array(1,2,3);
var i=0;

window.onload = function() {
  t1= window.setInterval((function(){f(ee[++i]);}), 1000);
}
function f(a){
alert(a);
}
</script>
</head>
<body>
</body>
</html>


Добавлено @ 18:20 
Цитата

Я бы и рад, да боюсь что так не получится сделать

Приведи задачу полностью, возможно можно обойтись одним таймером,но если надо несколько то возможно поможет такой вариант:
Код

<html>
<head> 
<script>
var t1, t2; var ee=new Array(1,2,3,4,5,6,7);
var i=0;

window.onload = function() {
  t1= window.setInterval((function(){f(ee[++i]);}), 1000);
  t2= window.setInterval((function(){f(ee[i+=1]);}), 1000);  
}
function f(a){
alert(a);
}
</script>
</head>
<body>
</body>
</html>


Добавлено @ 18:22 
Как сказал vasac, может и на самом деле можно изменить логику тела функции, например ты можеш создать несколько таймеров и создать определенные действия над посылаемыми агрументами.  

Автор: 12345c 19.10.2006, 18:41
Цитата(voronov @  19.10.2006,  16:29 Найти цитируемый пост)
Это я для примера привел, а по большому счету мне нужно каждую милисекунду вызывать функцию с разными параметрами 
Об этом гарантированно можно забыть, потому что изначально JS вообще ориентировался на таймер со скоростью 170 мс (системный), и меньший интервал было бесполезно давать. В последних версиях бр-ров видим, что малые интервалы помогают увеличить скорость, но обработка каждого события занимает время, соизмеримое с несколькими мс. И неизвестно, как планировщик процессов в JS распределит эти скудные ресурсы между очередью процессов. Скорее всего, они будут занимать простую очередь, но период отработки будет несолько мс или больше. В примере темы мы видим как раз результат работы планировщика, когда встречаются 2 процесса, претендующие на обработку и как-то разделяют общий ресурс - self.status . Проектирование поэтому  разумно начать с постановки "от задачи". Первый вопрос: что мы должны видеть. Ответ: мониторинг событий каждую секунду. Поэтому строим монитор событий - один процесс с нужным интервалом, который опрашивает переменные, изменяемые другими процессами, которые вы хотите независимо отключать. Любое другое решение будет нарываться на мелкие нестыковки и недостатки планирования событий. Даже сдвиг на 150-200 мс не могу предложить, потому что и он рано или поздно может сорваться даже под влиянием реального процесса в компьютере, занимающего время и не входящего в браузер.

Автор: voronov 19.10.2006, 19:28
Всем спасибо за советы...скорее всего придется менять логику внутри вызываемой функции

Автор: AKS 19.10.2006, 19:46
voronov, 
А что вообще нужно делать этим функциям? Неужели нужен такой короткий интервал времени? Можно было бы заменить все таймаутами (если б не короткие интервалы)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)