Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
ВнизКак работает таймер Найти похожие ветки
← →
Raduga (2003-05-27 13:31) [0]Уважаемые мастера, у меня к вам такой вопрос:
как ведет себя таймер (компонент TTimer), если его интервал задан , ну например, 1 с, а в его обработчике события выполняются действия занимающие порядка 10 с?
← →
MBo (2003-05-27 13:33) [1]Если бы у меня возник такой вопрос, я бы проэкспериментировал.
← →
Raduga (2003-05-27 13:36) [2]>MBo
Уже экспериментировал, вроде таймер ждет завершения процесса, а только потом срабатывает, но у меня какие-то смутные подозрения подозрения: не "скидывает" ли он свои вызовы куда-нибудь в стек?
← →
DmS (2003-05-27 13:37) [3]читай про очередь сообщений
← →
Raduga (2003-05-27 13:43) [4]>DmS (27.05.03 13:37)
Т.е. если пока процедура в онтаймере выполнится, то в очереди сообщений будет 10 вызовов ?
← →
sosv (2003-05-27 14:02) [5]При вжоде в процедуру устанавливай флаг, при выходе сбрасывай.
← →
Raduga (2003-05-27 14:09) [6]>sosv (27.05.03 14:02)
Timer.enabled?
← →
Digitman (2003-05-27 14:09) [7]
> Raduga
при таком временном "раскладе" :
если в теле процедуры-обработчика есть обращения к очереди с целью их выборки/диспетчеризации, то существует немалый риск переполнения стека кодового потока (текущего), обрабатывающего эти сообщения, что приведет к генерации исключения EStackOverflow с соответствующими "печальными" последствиями.
иначе - есть так же риск переполнения очереди сообщений, также ведущий к непредсказуемым последствиям, вплоть до снятия системой процесса с выполнения.
так что - пересматривай логику, дабы не допустить ни той ни другой ситуации.
← →
Raduga (2003-05-27 14:18) [8]А если в обработчике перед процедурой отключить таймер, а потом его включить? Не поможет ?
← →
Digitman (2003-05-27 14:30) [9]
> Raduga
а каков смысл ? все равно период вызова процедуры-обработчика будет не менее 10 сек !
либо интервал таймера увеличивай до значения периода, заведомо большего времени исполнения тела обработчика,
либо (если требуется как можно более оперативная реакция на событие таймера) пересматривай логику, при которой обработчик будет стартовать доп.кодовый поток (в теле которого и будет выполняться 10-секундная операция) и немедленно завершаться после этого
← →
KSergey (2003-05-27 15:07) [10]Digitman верно подметил ситуацию, при которой в обработчике происходит выборка соощений.
Но если она не происходит - то, на сколько я понимаю, происходт следующее: таймер ложит в очередь приложения сообщения WM_TIMER с указанным ему интервалом. Но Windows для WM_TIMER имеет свое мнение: таких сообщений в очереди может быть только одно, остальные отбрасываются (для WM_PAINT аналогично).
← →
___ALex___ (2003-05-27 15:15) [11]Raduga (27.05.03 13:43)
проверь на практике
я думаю сообщения WM_TIMER объединяются в одно
← →
Digitman (2003-05-27 15:41) [12]
> KSergey
Да, действительно, это немаловажное замечание, и на него следовало бы обратить внимание.
Процитирую для автора фрагмент хэлпа на WM_TIMER:
Remarks
The DispatchMessage function forwards this message when no other messages are in the thread"s message queue.
← →
yaJohn (2003-05-27 16:31) [13]Гм... Занятный вопрос.
Я всю жизнь при входе в длиннннный цикл выбрасывал на экран форму с многозначительным "Ждите...".
На форме стоит таймер с интервалом около 10 и по ОнТаймер - закрывает форму. Т.о. пока крутится мой цикл форма висит на экране забавляя юзера прогрессбаром, а стоит из цикла вывалится - сама себя закрывает.
Очень удобно получается. Немного мороки с прорисовкой, но это мелочи.
И вот в день 27 месяца мая года дветыщитретьего выясняется, что я всю сознательную жизнь подводил систему под монастырь забивая ее стек огромным колличеством ненужных сообщений и только гений Б.Г. и фантастическая стабильность НТ не дали свершится моим грязным замыслам...
← →
yaJohn (2003-05-27 16:36) [14]Только ногами не пинайте, я про TThread в курсе, но лень матушка и не на такие деяния род людской подвигает.
← →
___ALex___ (2003-05-27 16:48) [15]KSergey © (27.05.03 15:07)
для WM_PAINT не просто отбрасываются
(хе посмотрел бы я как тебе бы понравилась перерисока окон если б она работала как ты сказал! )
а происходит объединение update region-ов
← →
Переяслов Григорий (2003-05-27 18:28) [16]А какой смысл в событиях, следующих через 1 сек, а обрабатываемых 10 сек?
← →
Sandman25 (2003-05-27 18:37) [17]>А какой смысл в событиях, следующих через 1 сек, а обрабатываемых 10 сек?
Например, моя программа проверяет директорию на наличие там файлов для печати. Файлы особые, со специальными управляющими последовательностями форматирования печати. Их обработка может занять некоторое время (несколько секунд). Но пользователю нужно, чтобы его файл начал печататься как можно раньше. Поэтому я проверяю каталог каждую секунду (впрочем, интервал настраивается пользователем). Если файлов там нет, то и обработка происходит гораздо меньше секунды.
← →
Переяслов Григорий (2003-05-27 18:46) [18]Все хорошо. Когда появился файл, сделай Timer.Enabled := FALSE, а когда распечатал - TRUE и радуйся. Впрочем, в одном из предыдущих ответов это уже было.
← →
Sandman25 (2003-05-27 18:48) [19]Я не автор вопроса. Просто у меня похожая ситуация... Именно как Вы сказали, так я и делаю :)
Причем второе присваивание в finally блоке.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.029 c