Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> window.setTimeout. Нужен ли window, Если не сохраняем идентификатор таймера 
:(
    Опции темы
Ghirik
Дата 24.9.2007, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



В общем то, вопрос в названии.
Я так понимаю, что если запускать таймаут таким образом "window.setTimeout", то создается объект таймер. И даже, если будет окончен таймаут, этот таймер ни куда не денется. И если его принудительно не уничтожать, то так и будет висеть, как дочерний объект window.
А если не указывать принадлежность таймера, то есть надежда, что по завершении таймаута таймер уйдет в небытие.... Не смог нарыть информации про этот механизм... Разъясните...


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Zeroglif
Дата 24.9.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Ghirik @  24.9.2007,  06:39 Найти цитируемый пост)
Я так понимаю, что если запускать таймаут таким образом "window.setTimeout", то создается объект таймер.

Что такое "таймер" - не имеет значения, механизм не раскрыт, значение имеет, чей это метод, как его запускать, и что он возвращает. Всё остальное за рамками спецификаций. Относитесь к "таймеру" проще, как к обычной функции, вы передаёте этой функции аргументы, в её теле что-то такое весёлое происходит и она возвращает нам на память волшебное число, с помощью которого мы можем отменить исполнение.

Цитата(Ghirik @  24.9.2007,  06:39 Найти цитируемый пост)
И даже, если будет окончен таймаут, этот таймер ни куда не денется. И если его принудительно не уничтожать, то так и будет висеть, как дочерний объект window.

"Дочерний объект window" - это сам метод setTimeout, само собой он никуда не уходит, "таймер" же - это не объект, а процесс, отсрочка исполнения, "уничтожать" отсрочку не нужно (если надо отказаться от отсрочки, то используют соответствующий метод clearTimeout).

Цитата(Ghirik @  24.9.2007,  06:39 Найти цитируемый пост)
А если не указывать принадлежность таймера, то есть надежда, что по завершении таймаута таймер уйдет в небытие....

Принадлежность вообще не при чём. Использовать или не использовать составное(полное) имя - вопрос более общий, к setTimeout-y это относится так же, как и к любому другому свойству window.

PM MAIL WWW   Вверх
dsCode
Дата 24.9.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Ghirik, "метод" setTimeout(...) (как и большинство других: window.alert(...), window.clearTimeout(...) window.confirm(...) и т.д.) изначально принадлежит объекту window. Поэтому определение этого метода там же и останется, после того, как второй поток javascript перестанет работать (а вот какой объект создается во втором потоке - называется он "таймер" или еще как - не могу сейчас сказать).

В общем, в грубом определении setTimeout - это глобальная функция, которая принадлежит window, поэтому к ней, как и к любой другой глобальной переменной, можно обращаться без "префикса" window.


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
AKS
Дата 24.9.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dsCode @  24.9.2007,  10:46 Найти цитируемый пост)
...второй поток javascript перестанет работать

Что за "второй поток javascript"? Где можно почитать, у кого разузнать?

PM MAIL   Вверх
dsCode
Дата 24.9.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



AKS, где "научно" почитать - не скажу, не знаю сам. (Вот ляпнул, да? - Без аргументов =), но на самом деле, я полагаю, так и есть). Это я узнал от одного знакомого программиста, который, в принципе, далеко не новичок в js (он писал псевдо-мультипоточность в js (сам по себе javascript - не мультипоточный язык (в полном понимании этого слова))). Информация мной лично - не проверена (чтобы утверждать, что js имеет именно два потока). Но, опять же повторю - думаю, так и есть (основной поток и поток setTimeout'a). Понимаю, аргумент очень не веский (какой-то там знакомый сказал), но - я видел, что он пишет и, в принципе, не сомневался в его словах (в частности, написан у его был класс Tread, который работал с потоком setTimeout'a - и большие нагруженные вещи выполнялись параллельно основной работе браузера (основного потока)). Вот в в этой теме я описывал эту мысль. А вообще, надо будет поискать эту тему подробней и пообсуждать.



--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
AKS
Дата 24.9.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dsCode @  24.9.2007,  11:38 Найти цитируемый пост)
Это я узнал от одного знакомого программиста, который, в принципе, далеко не новичок в js...

Да я-то тоже узнаю все от одного программиста, далеко не новичка. Вот только он по этому поводу сказал бы, что-то вроде: "А нету, сынок, второго потока, как не ищи". smile

Цитата(dsCode @  24.9.2007,  11:38 Найти цитируемый пост)
написан у его был класс Tread

Классы Thread не редкость, только авторы волей-неволей все же признают (Threading in JavaScript 1.7):
Цитата

A generator allows you to suspend a function’s execution and resume it at a later time.

Цитата

generators can be used to write code in a style similar to threaded programming.


Цитата(dsCode @  24.9.2007,  11:38 Найти цитируемый пост)
А вообще, надо будет поискать эту тему подробней и пообсуждать.

Хорошо бы - дополнительная информация не бывает лишней.


PM MAIL   Вверх
dsCode
Дата 24.9.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



AKS, да, возможно понятие "второй поток" образное, принято было между нами для удобства обозначения. Еще раз повторю - эту тему я знаю поверхностно (что собственно и написал в предыдущем посте), чтобы уверенно что-то рассуждать. Поэтому - чтобы мы знали ее хорошо - вместе поищем официальную инфу по этому вопросу и будем уже с уверенностью говорить (а понты ведь не имеют значения, только истина имеет значение; я ведь поэтому и сказал, что "информация мной лично не проверена", что я не уповаю на мнение одного человека).

Цитата(AKS @  24.9.2007,  12:00 Найти цитируемый пост)
generators can be used to write code in a style similar to threaded programming.

ну вот поэтому я и сказал "псевдо-"

Это сообщение отредактировал(а) dsCode - 24.9.2007, 12:27


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
cruelangel
Дата 24.9.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



Код
setTimeout( function(){alert(1)}, 1000 );
while( true );

PM MAIL   Вверх
dsCode
Дата 24.9.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



cruelangel

Код

setTimeout( function(){alert(1)}, 1000 );
while( true ) alert(2);


alert(1) прорвется и будет вторым модальным окном наряду с alert(2) =) ну понятно, почему.

Да, можно сделать пока такие выводы: "второй поток" - метафора и понятие образное, "мультипоточность в js" - такое же образное понятие и идет с приставкой "псевдо".

Это сообщение отредактировал(а) dsCode - 24.9.2007, 13:11


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
cruelangel
Дата 24.9.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



это только в гекконах
PM MAIL   Вверх
Ghirik
Дата 24.9.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Всем спасибо, значит setTimeout(), это метод объекта window. И не имеет значения, указывается window или нет, события происходят одинаковые. Понятно. А таймер,  понятие абстрактное, создано для удобства, на самом деле, подразумевается таймаут, параметры которого мы и задаем. Было бы странно возвращать идентификатор таймаута. smile
А второй поток, наверное, ещё абстрактнее таймера, скорее в него отводят все процессы, которые сквозняком обращаются к функциям системы. В Windows ведь задаются таймеры, наверное они и используются для задания временных интервалов, и получается, что работают независимо от скрипта. А по окончании интервала заданного системному таймеру, происходит прерывание, по которому выполнение назначенной функции ставится первой в очереди команд, или там, ещё по каким правилам.



--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
dsCode
Дата 24.9.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



AKS, кстати, в той статье по ссылке - ориентация на версию 1.7 с ее yieldgeneratoriterator и прочими. Псево-мультипоточный класс Thread того человека, который мне говорил о "втором потоке" был написан еще два года назад, где еще не было ни yield, ни даже FF 2. Хотя, в сущности, это ничего не меняет - так, к слову. Вообще, предлагаю сделать отдельную тему, о "Псевдо-мультипоточности JS", где подробно описывать этот механизм, когда он может быть использован, какие нюансы и т.д.

---------------------------------------

P.S.: давайте вот такой код попробуем и объясним, почему window.a после выполнения основного потока (цикл for), который "подвешивает" браузер имеет уже значение 17, а не 0. Опять же - только в гекко, но все же. Значит значение вычислялось, пока работал цикл. Получается основной поток - прорисовывает окно, а во "втором" (нет никакой ложки) идет вычисление. Или вычислялось оно просто по истечению suspend'a, вклиниваясь в цикл?

Код

<table width="100%" border="1">
  <tr valign='top'>
    <td><div id='test' style='border: 1px solid black;'></div></td>
    <td><div id='test2' style='border: 1px solid black;'></div></td>
    <td><div id='test3' style='border: 1px solid black;'></div></td>
  </tr>
</table>
<script type="text/javascript">

window.a = 0;

window.setInterval(function() {
  document.getElementById('test').innerHTML += window.a + '<br />';
  window.a++;
}, 1000);

window.setInterval(function() {
  document.getElementById('test2').innerHTML += window.a + '<br />';
  window.a++;
}, 1000);

for (var k = 0; k < 10000; k++) {
  document.getElementById('test3').innerHTML = k;
}
</script>


-----------------------------------------------------------------------------

Updated:

ага, хрен оно вычисляется.

Код

for (var k = 0; k < 60000; k++) {
  document.getElementById('test3').innerHTML = k;
  if (k == 59998) {
    alert(window.a); // выведет 0
  }
}


Но после этого - моментально выводит 30 значений, но "никаких 1000 миллисекунд". Это означает, что время suspend'a для функций setInreval'ов уже как бы "просроченно" и они моментально отрабатывают. Или как это более точно объяснить?

Это сообщение отредактировал(а) dsCode - 24.9.2007, 19:04


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
AKS
Дата 24.9.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dsCode @  24.9.2007,  16:18 Найти цитируемый пост)
браузер имеет уже значение 17, а не 0. Опять же - только в гекко, но все же.

Я в прошлом году написал маленький скриптик для "снегопада". Для анимации каждой снежинки, которая должна была падать сверху вниз, раскачиваясь в стороны, создавался свой экземпляр конструктора. В прототипе конструктора имелось несколько функций, которые "управляли" снежинкой.  Одна из функций запускалась посредством метода window.setInterval. В результате получилось, что я "с дуру" для каждой снежинки установил свой интервал. Так вот, когда этих функций, выполняемых через заданные промежутки времени, создавалось слишком много (определялось кол-вом снежинок, например 60 штук), можно было наблюдать интересный эффект. Кстати, спасибо ksnk - он первый сообщил мне об этом. 
Эффект этот наблюдался только в Gecko, и заключался он в следующем. Когда браузер не успевал выполнить все функции вовремя, причем накапливалось их сразу несколько, то он (браузер FF) выполнял их тогда, когда у него освобождались ресурсы. Получалось, что снежинка, которая должна была через каждые 50 мс передвинуться на 2 px, передвигалась один раз в 2 с, но сразу на десяток пиксел. И так не с одной снежинкой (точнее, с функцией), а сразу со всеми. Очень смешной был эффект - браузер, как бы извиняясь, предлагал: "Ребят, я тут задержался малость, но сейчас все сходу наверстаю!". 
А IE и Opera выполняли себе стабильно через те промежутки времени, которых им хватало на обработку функций, вызванных ранее.
Происходит это потому, что в Gecko есть такая фишка. Браузер высчитывает время задержки, если таковая случилась, и видимо где-то там в своих "поторохах" сохраняет для вот таких вот описанных выше "эффектов", т.е. вычесть эту задержку из имеющегося интервала, чтобы "нагнать упущенное". Кстати, это время задержки передается первым аргументом в функцию, которая в свою очередь была передана методам setTimeout/setInterval (на это мне Zeroglif открыл глаза, показав где об этом прочесть). Вот пример для удобства:
Код

window.setTimeout(function () {
                      window.status += 'increase of delay: ' +
                                        arguments[0];
                  }, 500);

(function () {
    var t = new Date;
    return function () {
        while (new Date - t < 2000);
        window.status = 'Suspended on: ' + (new Date - t) + ' ms, ';
    };
})()();

Функция в setTimeout выполнится не через полсекунды, а тогда, когда для нее появится время, и время задержки будет передано первым параметром (будет около 1500 мс). Видимо, это и вычитается из заданных задержек.
Вот такой он, этот Gecko...

Это сообщение отредактировал(а) AKS - 24.9.2007, 19:10
PM MAIL   Вверх
cruelangel
Дата 24.9.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



по этой причине я отказался от использования setInterval в пользу такой вот загогулины:

Код
Function.prototype.timeOut= function( time ){
    var func= this;
    top.setTimeout( function( ){ // self.setTimeout don't works in designMode in FF
        if( func( ) ) func.timeOut( time );
    }, time );
    return func;
}


Это сообщение отредактировал(а) cruelangel - 24.9.2007, 20:49
PM MAIL   Вверх
AKS
Дата 24.9.2007, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(cruelangel @  24.9.2007,  19:14 Найти цитируемый пост)
по этой причине я отказался от использования setInterval 

Ну вот и я о том же. Тогда, почти год назад, ksnk показал, что лучше всего все функции, какие должны вызываться через определенные промежутки времени (в данный момент пишу о случае с одинаковыми интервалами), "совать" в одну, и только ее одну передавать в setInterval. Техника может быть такой. В какой-то момент вызывается метод window.setInterval. Функция, которая ему передается, пробегает по массиву с функциями и вызывает их все. В это время в массив могут быть добавлены/удалены функции, которые выполнили свою задачу. Если в массиве функций не осталось, то делается window.clearInterval. Ничего себе так экономия получается...
PM MAIL   Вверх
dsCode
Дата 24.9.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



AKS
Цитата(AKS @  24.9.2007,  19:07 Найти цитируемый пост)
Очень смешной был эффект - браузер, как бы извиняясь, предлагал: "Ребят, я тут задержался малость, но сейчас все сходу наверстаю!". 
А IE и Opera выполняли себе стабильно через те промежутки времени, которых им хватало на обработку функций, вызванных ранее.
Происходит это потому, что в Gecko есть такая фишка. Браузер высчитывает время задержки, если таковая случилась, и видимо где-то там в своих "поторохах" сохраняет для вот таких вот описанных выше "эффектов", т.е. вычесть эту задержку из имеющегося интервала, чтобы "нагнать упущенное". Кстати, это время задержки передается первым аргументом в функцию, которая в свою очередь была передана методам setTimeout/setInterval

да, это я уже заметил в предыдущем посте (там, где updated). За пример - спасибо. Действительно, такой параметр приходит, причем первым, - и только в FF. Для IE и Opera - undefined.

Цитата(AKS @  24.9.2007,  19:07 Найти цитируемый пост)
(на это мне Zeroglif открыл глаза, показав где об этом прочесть)

покажите и мне, если не затруднит =) тоже интересно )

Цитата(AKS @  24.9.2007,  19:07 Найти цитируемый пост)
А IE и Opera выполняли себе стабильно через те промежутки времени, которых им хватало на обработку функций, вызванных ранее.

не совсем понятно. Такое ощущение, что IE и Опере по-барабану на это "упущенное время", они "тупо" начинают выполнять setInterval'ы и setTimeout'ы после "освобождения ресурсов", потому что и в IE и в Опере - отсчет начинался с 0 - "согласно расписанию", а в FF - тоже с 0 (а не с 17, как выяснилось в моей последней поправке), но - с "учетом потерянного времени", которое, как оказалось - передалось первым параметром! Хм... +1.

Добавлено через 13 минут и 10 секунд
Цитата(AKS @  24.9.2007,  20:04 Найти цитируемый пост)
(в данный момент пишу о случае с одинаковыми интервалами)

а что насчет неодинаковых интервалов?


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
AKS
Дата 24.9.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dsCode @  24.9.2007,  20:05 Найти цитируемый пост)
покажите и мне, если не затруднит

Да чего же тут трудного smile, пожалуйста - Creating time delays.
Цитата(dsCode @  24.9.2007,  20:05 Найти цитируемый пост)
Такое ощущение, что IE и Опере по-барабану на это "упущенное время"

А что, так и есть. Выполняют код, когда движок освободится (он же single-threaded как-никак).

Цитата(dsCode @  24.9.2007,  20:05 Найти цитируемый пост)
а что насчет неодинаковых интервалов? 

Да незнаю пока - не сталкивался...


Это сообщение отредактировал(а) AKS - 24.9.2007, 20:20
PM MAIL   Вверх
Zeroglif
Дата 24.9.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Другая ссылка про lateness.
И ещё.
И ещё.

Правда, на мой взгляд это никак не объясняет поведение setInterval в коде dsCode.

Это сообщение отредактировал(а) Zeroglif - 24.9.2007, 20:58
PM MAIL WWW   Вверх
cruelangel
Дата 24.9.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



использование window.setTimeout - это как-то не в ооп стиле smile для полноты картины предлагаю использовать:

var func= function( ){ alert( 1 ) };
window.exec( func );
PM MAIL   Вверх
AKS
Дата 24.9.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Zeroglif @  24.9.2007,  20:33 Найти цитируемый пост)
Другая ссылка про lateness. 

Вот как-раз, чтобы поправить вот это:
Цитата(dsCode @  24.9.2007,  20:05 Найти цитируемый пост)
Действительно, такой параметр приходит, причем первым, - и только в FF.

Не обязательно первым, а первым "свободным индексом" в объекте аргументов.


Цитата(cruelangel @  24.9.2007,  20:47 Найти цитируемый пост)
window.exec( func ); 

window.execScript может быть? А как им заменить window.setTimeout?


Это сообщение отредактировал(а) AKS - 24.9.2007, 20:54
PM MAIL   Вверх
cruelangel
Дата 24.9.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



window.exec= function( func ){
    return func( );
}

smile заменить, конечно не сможет, зато запуск функции с задержкой и без оной будут производиться однотипно - через window

Это сообщение отредактировал(а) cruelangel - 24.9.2007, 21:15
PM MAIL   Вверх
SelenIT
Дата 24.9.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(Zeroglif @  24.9.2007,  20:33 Найти цитируемый пост)
это никак не объясняет поведение setInterval в коде dsCode

Вот только хотел спросить: как эта задержка может быть отрицательной? Я добавил в пример dsCode вывод arguments[0] - если для первой итерации она составляет порядка 8000 мс, то к 15-й при некоторых запусках постепенно уменьшается до отрицательной величины -4000 - -6000. Далее, по идее, должен идти штатный режим, но и при нем задержка то колеблется в пределах ±15 мс около нуля, а то... около -1000. Получается, что таймер "заодно" выполняет и следующую итерацию - ради оптимизации рендеринга, что ли? Или это артефакт? Как объяснить эту странность?

Это сообщение отредактировал(а) SelenIT - 24.9.2007, 22:10


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Zeroglif
Дата 24.9.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(SelenIT @  24.9.2007,  22:31 Найти цитируемый пост)
Получается, что таймер "заодно" выполняет и следующую итерацию - ради оптимизации рендеринга, что ли?

Получается, что таймер ждёт, когда откроется форточка, чтобы в неё влезть, но, если в IE до её открытия в очереди стоит всего одно "переждавшее" действие, то в FF - все "переждавшие" по времени к моменту открытия форточки. Поэтому к выходу из loop-а никто ничего ещё не сделал, но уже приготовился сделать - IE приготовился изменить innerHTML(IE) один раз, FF несколько раз подряд. Так примитивно выглядит со стороны (найти бы того, кто почитает код симанки...).

Вот ещё странности со сдвоенными setInterval, там же очередная ссылка на багзилу.
PM MAIL WWW   Вверх
SelenIT
Дата 24.9.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Zeroglif, с "переждавшими" действиями более-менее понятно, но все-таки, откуда могут взяться "отрицательные" задержки? Неужели таймер пытается "втиснуть" в эту открывшуюся "форточку" не только все "переждавшие" действия, но и пару-тройку "недождавших" (как бы "на всякий случай, а то когда еще придется...")? Или же они - мой личный глюк?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Zeroglif
Дата 24.9.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(SelenIT @  25.9.2007,  00:07 Найти цитируемый пост)
откуда могут взяться "отрицательные" задержки?

don't know
PM MAIL WWW   Вверх
AKS
Дата 25.9.2007, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(SelenIT @  24.9.2007,  23:07 Найти цитируемый пост)
Неужели таймер пытается "втиснуть" в эту открывшуюся "форточку" ...? Или же они - мой личный глюк? 

Это их глюк. У них же там бардак полнейший! Вот, например из ссылок Zeroglif'а, первый рапорт об аргументе с задержкой датирован 1999 годом. Пишут: "Надо бы сделать одно из двух - убрать эту отладочную ин-фу, или хотя бы задокументировать". Потом, 2004 год: "Посмотрели, поискали - оказалось, что до сих пор не задокументировали". С интервальными глюками, так вообще - полгода писали-писали другу другу, в конце концов Брендан: "Кто-нибудь займитесь этим глюком - у меня нету времени!". Ну вот и занимаются до сих пор... 
Короче говоря, то ли для них это серьезная проблема, что решить никак не могут, то ли просто плюнули на это все. А что вообще ждать от бесплатного софта? smile
В этом плане IE, все эти годы работая без подобных проблем, и уже, как многие считают, находясь в "преклонном возрасте", выглядит молодцом. Честь и хвала разработчикам IE, которые написали такой стабильный в этом плане движок!
PM MAIL   Вверх
cruelangel
Дата 25.9.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



// Leave an extra slot for a secret final argument that
// indicates to the called function how "late" the timeout is.

хакеры, блин Ж-)


> Честь и хвала разработчикам IE, которые написали такой стабильный в этом плане движок! 

в каком плане?

Это сообщение отредактировал(а) cruelangel - 25.9.2007, 11:03
PM MAIL   Вверх
AKS
Дата 25.9.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



cruelangel, в каком плане? Специально дошел до тавтологии, да еще и выделил курсивом, чтобы акцентировать мысль на том, что обсуждалось. Поясню.
Всем этим "недоразумения" с Gecko'вским поведением в плане setInterval, я решил противопоставить IE'шную стабильность. Просто IE никогда не давал мне повода беспокоиться о том, что в каком-нибудь dhtml у меня появятся явные проблемы, вроде "тормозов" или "аритмии", ну или еще чего. Вот за это и спасибо разрабам IE.

Мне, на самом деле, без разницы - IE, Gecko, Opera. Просто на форумах большинство "балдеет" от FF, незабывая "пнуть" IE. "Текут слюни и сопли" от современных "классных" возможностей FF, при этом народ не знает, что есть "копнуть" FF, то окажется, что "нутро гниловато" - древнейшие баги не исправлены. 
У всех, конечно же, свои недостатки. Но есть и отлично реализованные возможности. Почему бы об этом не сказать пару добрых слов? Даже в адрес не "модного" браузера...

Это сообщение отредактировал(а) AKS - 25.9.2007, 14:11
PM MAIL   Вверх
Ghirik
Дата 25.9.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Цитата

Даже в адрес не "модного" браузера...


А я IE люблю, smile для людей сделан, а не для программистов. smile 

Не примите смайлик на свой счет... smile 

Это сообщение отредактировал(а) Ghirik - 25.9.2007, 14:37


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
cruelangel
Дата 25.9.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



и в чём же тут баг? вполне логичное поведение. если задал период в 1 секунду - получи 10 срабатываний за 10 секунд. если разработчик написал функцию, которая за эту секунду не успевает отработать - получай тормоза.



Это сообщение отредактировал(а) cruelangel - 25.9.2007, 17:35
PM MAIL   Вверх
AKS
Дата 25.9.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(cruelangel @  25.9.2007,  17:33 Найти цитируемый пост)
...если разработчик написал функцию, которая за эту секунду не успевает отработать - получай тормоза.

В основном речь идет о работе с веб-документом, а в нем много всяких событий происходит. Эти события могут стать причиной задержки выполнения "задуманного"...

PM MAIL   Вверх
cruelangel
Дата 25.9.2007, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



поэтому делать надо с запасом. большим. 
PM MAIL   Вверх
AKS
Дата 26.9.2007, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(cruelangel @  25.9.2007,  21:11 Найти цитируемый пост)
поэтому делать надо с запасом. большим. 

С "большим запасом"? Это, к примеру, для изменения прозрачности изображений установить интервал в одну, а то и в две секунды - вот будет спецэффект! smile
А главное - в Gecko не будет "тормозов"! smile

PM MAIL   Вверх
cruelangel
Дата 26.9.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



1. для анимации лучше устанавливать интервал между концом предыдущей итерации и началом следующей, а не между началами итераций.
2. не нужно применять анимацию там, где она не нужна.


Это сообщение отредактировал(а) cruelangel - 26.9.2007, 12:46
PM MAIL   Вверх
AKS
Дата 26.9.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



cruelangel
1. Ради Gecko чего только не сделаешь. smile
2. Какие критерии оценки "нужна/не нужна анимация".
PM MAIL   Вверх
cruelangel
Дата 26.9.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



1. геккон тут не при чём. это простая и эффективная защита от возможных наслоений.
2. когда она ничем не обоснована - она не нужна. 
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1866 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.