Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
14-26704
Mike_Goblin
2003-05-21 18:11
2003.06.09
Улыбнитесь, коллеги


1-26520
Project111
2003-05-27 17:19
2003.06.09
Создать документ Word


6-26637
SeNtiMeL
2003-04-06 00:57
2003.06.09
Как проверить порт на компьютере на свободность ?


14-26729
Basic
2003-05-07 00:24
2003.06.09
О наболевшем, хочется пользоваться этим сайтом


1-26588
vgb
2003-05-28 15:17
2003.06.09
ReadKey





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский