- HTA, JS: Проблема SetTimeout
- Сообщения 19
- 1 Тема от mikser 2011-12-08 13:35:17 (изменено: mikser, 2011-12-09 01:26:34)
- Тема: HTA, JS: Проблема SetTimeout
- 2 Ответ от Rumata 2011-12-09 02:18:59
- Re: HTA, JS: Проблема SetTimeout
- 3 Ответ от mikser 2011-12-09 12:08:10 (изменено: mikser, 2011-12-09 13:13:40)
- Re: HTA, JS: Проблема SetTimeout
- 4 Ответ от Xameleon 2011-12-09 13:15:19
- Re: HTA, JS: Проблема SetTimeout
- 5 Ответ от mikser 2011-12-09 14:03:59 (изменено: mikser, 2011-12-09 14:04:33)
- Re: HTA, JS: Проблема SetTimeout
- 6 Ответ от Xameleon 2011-12-09 15:34:49
- Re: HTA, JS: Проблема SetTimeout
- 7 Ответ от mikser 2011-12-09 16:18:47 (изменено: mikser, 2011-12-09 16:37:06)
- Re: HTA, JS: Проблема SetTimeout
- 8 Ответ от Xameleon 2011-12-09 16:26:16
- Re: HTA, JS: Проблема SetTimeout
- 9 Ответ от alexii 2011-12-09 17:26:52
- Re: HTA, JS: Проблема SetTimeout
- 10 Ответ от Любитель 2011-12-09 21:10:50
- Re: HTA, JS: Проблема SetTimeout
- 11 Ответ от Rumata 2011-12-09 21:54:11
- Re: HTA, JS: Проблема SetTimeout
- 12 Ответ от Любитель 2011-12-10 07:05:59
- Re: HTA, JS: Проблема SetTimeout
- 13 Ответ от Rumata 2011-12-10 09:45:57
- Re: HTA, JS: Проблема SetTimeout
- 14 Ответ от Любитель 2011-12-10 20:49:03
- Re: HTA, JS: Проблема SetTimeout
- 15 Ответ от alexii 2011-12-10 21:22:20
- Re: HTA, JS: Проблема SetTimeout
- 16 Ответ от mikser 2011-12-11 00:53:24 (изменено: mikser, 2011-12-11 02:51:00)
- Re: HTA, JS: Проблема SetTimeout
- 17 Ответ от Rumata 2011-12-11 08:42:41
- Re: HTA, JS: Проблема SetTimeout
- 18 Ответ от alexii 2011-12-11 12:05:47
- Re: HTA, JS: Проблема SetTimeout
- 19 Ответ от mikser 2011-12-11 14:09:58 (изменено: mikser, 2011-12-11 17:38:33)
- Re: HTA, JS: Проблема SetTimeout
HTA, JS: Проблема SetTimeout
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщения 19
1 Тема от mikser 2011-12-08 13:35:17 (изменено: mikser, 2011-12-09 01:26:34)
- mikser
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Тема: HTA, JS: Проблема SetTimeout
Проблема точно существует в IE8, на IE 9 не тестировал.
Суть в том нельзя одновременно запустить 10 000 сеттаймаутов или больше, на 9850 ом setTimeout’e генерируется исключение.
Во всех остальных браузерах этого ограничения нет. Только в IE.
Пытался лечить это с помощью заимствований setTimeout у new ActiveXObject(«HTMLFile») но ничего не получилось,
вот пример:
Вопрос — как преодолеть это ограничение?
Самое гадкое в этой не доработке МС, что если убрать трай катч то даже не поймешь в чем дело, ИЕ не выдаст ни каких внятных сообщений об ошибке.
2 Ответ от Rumata 2011-12-09 02:18:59
- Rumata
- Разработчик
- Неактивен
- Рейтинг : [ 31 | 0 ]
Re: HTA, JS: Проблема SetTimeout
как преодолеть это ограничение?
Скорее всего — никак. Возможно ограничение связано с ограничением по памяти — ведь каждый таймаут создается в отдельном контексте, который требует расходов памяти.
Поделитесь, пожалуйста, что это у вас за задача такая, что Вам требуется одновременно 10к таймаутов? Насколько я помню, дискретность таймеров в JS примерно 10 мсек, то есть таймер не будет выполняться чаще чем раз в 10 мсек. Мне кажется Вам следует пересмотреть архитектуру приложения.
3 Ответ от mikser 2011-12-09 12:08:10 (изменено: mikser, 2011-12-09 13:13:40)
- mikser
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Re: HTA, JS: Проблема SetTimeout
Я имел ввиду может есть какие нить сторонние ActiveX с таймером на которые можно повесить JS хэндлеры?
Кстати мне точность до мсек не важна. Главное что бы отложеная задача в конечном итоге была выполнена.Возможно ограничение связано с ограничением по памяти — ведь каждый таймаут создается в отдельном контексте
Тут я с вами не согласен. Все сет таймаутные и сет интервальные функции выполняются в контексте глобального обекта window. То есть this == window (внутри функции которая вызывается по сетТаймауту). А если вы имели в виду замыкания как то в примере внутри функции foo объект obj на который ссылается безымянная функция вызываемая по сетТаймауту, то ответ опять таки нет — дело не в этом. Тут можно отказаться от использования замыкания, использовав вместо функции, простую строку, объект HTML передвавать по его ID (HTML аттрибут ID — строка). Я так делал и увидел что ошибка IE по прежнему вызывается следовательно замыкания тут не причем.
4 Ответ от Xameleon 2011-12-09 13:15:19
- Xameleon
- Разработчик
- Неактивен
- Рейтинг : [ 39 | 0 ]
Re: HTA, JS: Проблема SetTimeout
mikser:
Самое гадкое в этой не доработке МС, что если убрать трай катч то даже не поймешь в чем дело, ИЕ не выдаст ни каких внятных сообщений об ошибке.
А пункты в настройках IE, в разделе «Дополнительно» Вы выставляли ?
а) Отключить отладку сценариев (Internet Explorer)
б) Отключить отладку сценариев другие
в) Показывать уведомление о каждой ошибке сценария2) Абсолютно соглашусь с Rumata:
Поделитесь, пожалуйста, что это у вас за задача такая, что Вам требуется одновременно 10к таймаутов?
.
Мне кажется Вам следует пересмотреть архитектуру приложения.3) Как ещё один из вариантов — у IE есть особенность останавливать скрипты, выполнение которых занимает либо слишком много времени. Но это уже чисто предположение.
Попробую сегодня сэмулировать ситуацию.
5 Ответ от mikser 2011-12-09 14:03:59 (изменено: mikser, 2011-12-09 14:04:33)
- mikser
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Re: HTA, JS: Проблема SetTimeout
А пункты в настройках IE, в разделе «Дополнительно» Вы выставляли ?
а) Отключить отладку сценариев (Internet Explorer)
б) Отключить отладку сценариев другие
в) Показывать уведомление о каждой ошибке сценарияВыставил. Всеравно сообщений об ошибке не замечено.
Попробую сегодня сэмулировать ситуацию.
Достаточно сохранить мой код в html файл и запустить.
6 Ответ от Xameleon 2011-12-09 15:34:49
- Xameleon
- Разработчик
- Неактивен
- Рейтинг : [ 39 | 0 ]
Re: HTA, JS: Проблема SetTimeout
Достаточно сохранить мой код в html файл и запустить.
Не люблю я Javascript и длинный код.
Проверил на 10000 таймеров в IE. Всё пашет.
7 Ответ от mikser 2011-12-09 16:18:47 (изменено: mikser, 2011-12-09 16:37:06)
- mikser
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Re: HTA, JS: Проблема SetTimeout
У хамелеона в IE9 все пашет. У меня не пашет в IE8. Отказываться от поддержки IE8 нет желания, так как он поставляется вместе с win7 по умолчанию. А обновлять браузер который как браузер не использую я не хочу из принципа.
8 Ответ от Xameleon 2011-12-09 16:26:16
- Xameleon
- Разработчик
- Неактивен
- Рейтинг : [ 39 | 0 ]
Re: HTA, JS: Проблема SetTimeout
mikser, в очередной раз словами, уважаемого Rumata напоминаю:
Поделитесь, пожалуйста, что это у вас за задача такая, что Вам требуется одновременно 10к таймаутов?
.
Мне кажется Вам следует пересмотреть архитектуру приложения.9 Ответ от alexii 2011-12-09 17:26:52
- alexii
- Разработчик
- На форуме
Re: HTA, JS: Проблема SetTimeout
Ну, до кучи, и я присоединю свой голос к высказанной просьбе.
10 Ответ от Любитель 2011-12-09 21:10:50
- Любитель
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Re: HTA, JS: Проблема SetTimeout
Может это чем поможет
Можно к хозяину сайта обратиться.А вообще то осёл вешается на больших циклах, что взять с убогого.
А может осёл просто в какой то момент перестаёт успевать отслеживать все таймеры?Мне тоже любопытно, зачем столько таймеров одновременно.
11 Ответ от Rumata 2011-12-09 21:54:11
- Rumata
- Разработчик
- Неактивен
- Рейтинг : [ 31 | 0 ]
Re: HTA, JS: Проблема SetTimeout
Все сет таймаутные и сет интервальные функции выполняются в контексте глобального обекта window. То есть this == window (внутри функции которая вызывается по сетТаймауту).
Обратите внимание как я сказал:
каждый таймаут создается в отдельном контексте
Я не мог вспомнить другой перевод (точнее, определение) слова scope, активно используемого в JavaScript. Вот оно — область видимости (спасибо коллеге Любитель за ссылку — я о ней знаю, но в данный момент успешно забыл). Так вот, для каждой функции создается своя область видимости. Посему Ваше следующее высказывание в некоторой степени не соответствует сказанному мной.
Все сет таймаутные и сет интервальные функции выполняются в контексте глобального обекта window
То есть существуют область видимости (контекст создания — я имел в виду это) и область исполнения (то, что имели в виду Вы). Просто сравните результаты двух таймаутов (строка — через 1 сек, функция — через 10 сек)
Но! Если вместо alert(x) Вы укажете alert(this === window), то в обоих случаях получите результат — true. И это верно — потому что контекст вызова — глобальный. Это то, опять же, о чем говорили Вы.
12 Ответ от Любитель 2011-12-10 07:05:59
- Любитель
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Re: HTA, JS: Проблема SetTimeout
Просто сравните результаты двух таймаутов (строка — через 1 сек, функция — через 10 сек)
А нельзя ли для не профессионалов на пальцах показать, что сравнивать, как сравнивать, что за результаты?
13 Ответ от Rumata 2011-12-10 09:45:57
- Rumata
- Разработчик
- Неактивен
- Рейтинг : [ 31 | 0 ]
Re: HTA, JS: Проблема SetTimeout
Любитель, для полноты иллюстрации я объединил все сказанное в один скрипт. Каждый вызов установки таймера подробно описан в предшествующих комментариях. Вы можете сами его запустить и проверить — достаточно скопировать весь пример из этого сообщения и сохранить как html-страницу.
14 Ответ от Любитель 2011-12-10 20:49:03
- Любитель
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Re: HTA, JS: Проблема SetTimeout
достаточно скопировать весь пример из этого сообщения и сохранить как html-страницу.
Что я и сделал.
Спасибо, посмотрю.А товарищЪ mikser так и не откликнулся на многочисленные просьбы «трудящихся».
15 Ответ от alexii 2011-12-10 21:22:20
- alexii
- Разработчик
- На форуме
Re: HTA, JS: Проблема SetTimeout
Коллега mikser, небось, ботнет пишет, потому шифруется
.
16 Ответ от mikser 2011-12-11 00:53:24 (изменено: mikser, 2011-12-11 02:51:00)
- mikser
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Re: HTA, JS: Проблема SetTimeout
Не ботнет, а безобидный авторегистратор мейл боксов на mail.ru (не для того о чем вы могли подумать, если интересно зачем пишите в аську)
Написал «автомат» который делает последовательно несколько асинхроных http запросов в результате чего регистрируется почтовый ящик. Запросы асинхроные и последовательные потому не обойтись без сет таймаутов или интервалов. Если запустить одновременно 50 автоматов то через какое то время в самый разгар работы скрипт просто останавливается без сообщений об ошибках.
Из за чего может останавливаться HTA на IE8 без сообщений об ошибках? Вот нашел сеттаймауты с ними проблема такая имеет место быть но 10000 многовато действительно, столько в моем скрипте врятли могло создаться одновременно, что еще может быть?Да, это было второе о чем я подумал и написал — замыкания.
Области видимости создаются и без сеттаймаутов. Можете создать 10к scop’ов и убедится что дело не в них. Или вам не удалось повторить баг. У вас IE9?
Кстати коллеги, надеюсь вы не просто пофлудить сюда зашли, пожалуйста отпишитесь, удалось ли вам повторить этот баг IE8?
как преодолеть это ограничение?
Скорее всего — никак.
Оказалось что если нельзя но очень хочется то можно
.
В случае с Сеттаймаутом можно все повесить на один сетинтервал. Да конечно со всеми вытекающими: нагрузка на процессор, больше кушается памяти и потеря точности, но ведь работает!
Рабочий пример (ctrl+C, ctrl+V, сохранить в html, запустить в IE8 или ниже):
Осталось только придумать $setInterval.
17 Ответ от Rumata 2011-12-11 08:42:41
- Rumata
- Разработчик
- Неактивен
- Рейтинг : [ 31 | 0 ]
Re: HTA, JS: Проблема SetTimeout
удалось ли вам повторить этот баг
Ваш скрипт я запускал, но не понял его принципа. Я наблюдал декремент от 10000 до числа чуть меньше 20. Верно ли, что я наблюдал создание порядка 9980 таймеров? мсие 7 на висте.
18 Ответ от alexii 2011-12-11 12:05:47
- alexii
- Разработчик
- На форуме
Re: HTA, JS: Проблема SetTimeout
Не ботнет, а безобидный авторегистратор мейл боксов на mail.ru (не для того о чем вы могли подумать, если интересно зачем пишите в аську)
А зачем Вам столько почтовых ящиков? Ну, не приходят на ум иные целевые назначения.
Кстати коллеги, надеюсь вы не просто пофлудить сюда зашли smile , пожалуйста отпишитесь, удалось ли вам повторить этот баг IE8?
Ну, Вы сами этому поспособствовали, дав пищу для измышлений, не отвечая на вопрос о назначении. А IE8 у меня уже нет.
19 Ответ от mikser 2011-12-11 14:09:58 (изменено: mikser, 2011-12-11 17:38:33)
- mikser
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Re: HTA, JS: Проблема SetTimeout
Ваш скрипт я запускал, но не понял его принципа. Я наблюдал декремент от 10000 до числа чуть меньше 20. Верно ли, что я наблюдал создание порядка 9980 таймеров? мсие 7 на висте.
Скрипт увеличивает число на 1, а потом создает таймер чтобы через несколько секунд уменьшить таймер на 1, и так 10к раз. Судя по всему у вас баг повторился, так как счетчик не был обнулён.