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


 




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


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

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