Instructor wrote:Еще можно точку останова поставить на:
Code: Select all
oSys.Call("user32::KillTimer", this.hWndTimer, id);
Ничего интересного: два раза выходит на KillTimer() с разными идентификаторами. Хотя странно, если проверять выводом сообщений в заголовок окна, то там трижды выходит на KillTimer() – то есть с логикой работы, вроде, проблем никаких нет.
А потом (как, собственно, и раньше, AkelPad падает – вроде, все там же).
А если с логами, то вот такое выходит:
Code: Select all
set(true) 10 // одноразовый таймер
-> set(false) 11 // многоразовый таймер
-> _clear(10) #2 // дважды вызывается KillTimer(), но не думаю, что это должно мешать
-> set(false) 10 // многоразовый таймер с ID первого таймера
-> _clear(10) // это в самом конце, KillTimer() для первого ID
-> _clear(11) // и KillTimer() для второго ID
-> destroy // UnregisterCallback()
Instructor wrote:Если использовать одновременно только один SetTimer в одном скрипте, то да.
Ммм... так тогда в рамках одного скрипта быстрее использовать свой счетчик для получения уникальных идентификаторов.
Instructor wrote:Так это не падение, а ошибка объекта.
От этого ничего принципиально не меняется... откуда там посторонние идентификаторы в вызовах callback'а?
Instructor wrote:Попробуйте вынести код из timer.js напрямую в используемые скрипты, т.е. без использования Include().
Если тупо скопировать в начало файла (и закомментировать вызов Include()), то проблемы все те же: иногда callback вызывается с посторонним идентификатором (по-прежнему, видимо, из autoSaveSession,js, а там ведь timer.js и так не используется), а иногда не вызывается вообще (визуально это выглядит как статичная надпись в строке состояния).