| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Ну неправда. А повторный вызов обычно случается когда во время длительной обработки дергается 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 |
| По поводу интервала, это верно отчасти. Представляю как будет выглядеть реализация интерфейса пользователя... Ну в любом случае, таймер для такого случая не есть гуд. |