Всем привет! Итак, есть таймер и его обработчик. Таймер включается через timeSetEvent, а обработчик получая управление берет кое-что из памяти и уходит с этим еще кое-куда. Так вот если где-то там происходит задержка, то прога вылетает нафиг... Почему? Как с этим бороться? Спасибо
Возможно, во время задержки таймер срабатывает еще раз? Тогда надо его запретить на время выполнения процедуры "кое-куда".
2Quantum Так xSoft даже не указал что у него за таймер, ось и т.д(может у него многопоточный таймер). Какой-то таймер, кое-где, кое-что, кое-куда. .
Booster, таймер - timeSetEvent который, ос - WinXP n0name, 27: Ret Походу я нашел решение. Задержка происходила в обработчике данных, и я этот обработчик поместил в оконную процедуру. Когда срабатывает обработчик таймера и необходимо перейти в обработчик данных, то просто делаю PostMessage с передачей нужных аргументов этому окну. Сообщение встает в очередь, а управление возвращается обработчику таймера. Теперь задержки в оконной процедуре или обработчике данных, по идее, не должны влиять на события таймера. Пока работает стабильно
2xSoft The multimedia timer runs in its own thread Так что если твой код из отдельного потока обращается к GUI, то возможны проблемы.
В каком смысле? Обработчик таймера вынесен в DLL, и когда наступает время передать пару слов основной программе, он делает PostMessage главному окну, передает необходимые аргументы и дальше себе работает. Если происходят тормоза в процедуре окна, то просто обновление инфы тормозит, на работе таймера это не сказывается. Самое главное, что прога еще ни разу краха не испытала после применением этого способа
В том, что у тебя многопоточное приложение, а GUI на это не расчитано. Когда же ты используешь PostMessage, а не прямо обращаешься к интерфейсу из таймера, то в процедуре окна работает только один поток, и всё OK. Если же из таймера к GUI обращений нет, то можно и напрямую что-то делать в процедуре окна.
Booster, неосилил Фишка в том, чтобы создать комфортную работу для таймера. Его обработчик по мере необходимости должен сообщить главному окну, что наступило некоторое время, а окно должно вывести информацию на экран. Если в окне происходила задержка, то процесс падал. Использование PostMessage решило эту проблему, т.к. управление сразу возвращалось в таймер, а когда там окно проснется и сможет вывести инфу, это уже его забота и на работе таймера не сказывается.
Ну у тебя получился обычный WM_TIMER, только из-за PostMessage интервал не гарантирован. Тебе надо просто уведомить о событии или в равные промежутки?
Попробую объяснить суть задачи Есть переменные REAL_TIME DD 0 NEXT_TIME DD 65535 ; 1 минута, 5 секунд, 535 милисекунд Есть процедура пуска таймера. Таймер запускается с интервалом в 1 мс, и увеличивает на 1 переменную REAL_TIME. Как только REAL_TIME = NEXT_TIME происходит несколько IN/OUT'ов и вызов PostMessage для обновления инфы в окне программы. Я прекрасно понимаю, что такой способ определения времени имеет достаточную погрешность, но на интервалах 5-10 минут этого пока достаточно. Суть задачи заключается в определении наступления события REAL_TIME = NEXT_TIME, при этом после выполнения необходимых действий NEXT_TIME принимает новое значение. IceStudent, верно, но как видно из вышесказанного есть некоторые различия. Быть может есть и другие способы, возможно более точные, для определения наступления заданного времени в миллисекундах?
IceStudent, верно, хотелось бы как можно точнее. По форуму первым делом смотрел. Самый точный таймер с простой работой и есть timeSetEvent