Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Выполнение процедуры в заданное время


Автор: Unregistered 15.3.2004, 05:23
Нужно выполнять процедуру в заданное время. Первое что приходит в голову - поставить на Timer. установить интервал 50 мс . когда наступит время - выполнить процедуру. установить флажок, что процедура выполнена. затем через минуту снять флажок. Вопрос: есть ли более эффективный способ? Например, запускать вместо таймера отдельный поток? Чтоб можно было гарантировать выполнение процедуры? Спасибо.

Автор: cot 15.3.2004, 07:52
Можно и в отдельный поток. Но мне думается все равно без Timer-а не обойтись. Или в цикле постоянно сканировать системное время.

Автор: <Spawn> 15.3.2004, 17:05
если процедура выполняется длительное время и период через который она будет вызываться мал, то лучше использовать поток в комбинации со Sleep, так как с таймером может произойти следущая картина - таймер запускает процедуру, она выполняется, но не успев закончися, таймер запускает ее снова и получишь зависание своей проги. Было у меня как то такое - отдельный поток был лучшим выходом.

Автор: Guest 16.3.2004, 02:08
А я всегда думал, что пока процедура таймера не отработает, то по новой не запуститься. У меня есть программы с длительным выполнением процедуры (запись в базу по сети) на OnTimer и ни разу проблем не было. А можно как-то использовать WaitForSingleObject? В асинхронном варианте это было бы неплохое решение.

Автор: <Spawn> 16.3.2004, 05:36
По моему в таймере ты не как не остановишь следущий его вызов. Насколько я помню, сообщение WM_TIMER даже в очередь не ставиться, а прямиком доставляется обработчику.

Автор: Unregistered 16.3.2004, 07:03
В SetTimer передается Handle окна (если пользовать VCL компонент). Наверное очередь таки есть?

Автор: Петрович 16.3.2004, 08:49
Цитата
По моему в таймере ты не как не остановишь следущий его вызов. Насколько я помню, сообщение WM_TIMER даже в очередь не ставиться, а прямиком доставляется обработчику.

Ну неправда.
А повторный вызов обычно случается когда во время длительной обработки дергается Application.ProcessMessage
Добавлено @ 08:51
Кстати, если для топика использовать таймер, то не надо дергать его каждые 50мс. Достаточно сначала определить разницу между требуемым временем и текущим, и "зарядить" таймер именно на этот интервал.

Автор: X-Vlad 16.3.2004, 13:24
я реализовал подобное так:
на ontimer повесил процедуру, в начале процедуры поставил timer1.enabled:=false; а в конце процедуры опять запускал таймер timer1.enabled:=true; Ну и конечно контролировал что-бы процедура незапустилась опять, если например она выполнилась меньше чем за одну минуту.

Вроди нормально работает...

Автор: Unregistered 17.3.2004, 02:42
По поводу интервала, это верно отчасти. Представляю как будет выглядеть реализация интерфейса пользователя... Ну в любом случае, таймер для такого случая не есть гуд.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)