Windows script host settimeout

Содержание
  1. HTA, JS: Проблема SetTimeout
  2. Сообщения 19
  3. 1 Тема от mikser 2011-12-08 13:35:17 (изменено: mikser, 2011-12-09 01:26:34)
  4. Тема: HTA, JS: Проблема SetTimeout
  5. 2 Ответ от Rumata 2011-12-09 02:18:59
  6. Re: HTA, JS: Проблема SetTimeout
  7. 3 Ответ от mikser 2011-12-09 12:08:10 (изменено: mikser, 2011-12-09 13:13:40)
  8. Re: HTA, JS: Проблема SetTimeout
  9. 4 Ответ от Xameleon 2011-12-09 13:15:19
  10. Re: HTA, JS: Проблема SetTimeout
  11. 5 Ответ от mikser 2011-12-09 14:03:59 (изменено: mikser, 2011-12-09 14:04:33)
  12. Re: HTA, JS: Проблема SetTimeout
  13. 6 Ответ от Xameleon 2011-12-09 15:34:49
  14. Re: HTA, JS: Проблема SetTimeout
  15. 7 Ответ от mikser 2011-12-09 16:18:47 (изменено: mikser, 2011-12-09 16:37:06)
  16. Re: HTA, JS: Проблема SetTimeout
  17. 8 Ответ от Xameleon 2011-12-09 16:26:16
  18. Re: HTA, JS: Проблема SetTimeout
  19. 9 Ответ от alexii 2011-12-09 17:26:52
  20. Re: HTA, JS: Проблема SetTimeout
  21. 10 Ответ от Любитель 2011-12-09 21:10:50
  22. Re: HTA, JS: Проблема SetTimeout
  23. 11 Ответ от Rumata 2011-12-09 21:54:11
  24. Re: HTA, JS: Проблема SetTimeout
  25. 12 Ответ от Любитель 2011-12-10 07:05:59
  26. Re: HTA, JS: Проблема SetTimeout
  27. 13 Ответ от Rumata 2011-12-10 09:45:57
  28. Re: HTA, JS: Проблема SetTimeout
  29. 14 Ответ от Любитель 2011-12-10 20:49:03
  30. Re: HTA, JS: Проблема SetTimeout
  31. 15 Ответ от alexii 2011-12-10 21:22:20
  32. Re: HTA, JS: Проблема SetTimeout
  33. 16 Ответ от mikser 2011-12-11 00:53:24 (изменено: mikser, 2011-12-11 02:51:00)
  34. Re: HTA, JS: Проблема SetTimeout
  35. 17 Ответ от Rumata 2011-12-11 08:42:41
  36. Re: HTA, JS: Проблема SetTimeout
  37. 18 Ответ от alexii 2011-12-11 12:05:47
  38. Re: HTA, JS: Проблема SetTimeout
  39. 19 Ответ от mikser 2011-12-11 14:09:58 (изменено: mikser, 2011-12-11 17:38:33)
  40. 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
              • Разработчик
              • Неактивен
Оцените статью