![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование таймера в сервисе/службе
dmitry501 © (2005-07-07 10:25:00)Переделываю программу, в которой используются таймеры в службу.
Посмотрел в MSDN - описываетсяSetTimer()
Но смутила эта статья:
Knowledge Base
INFO: SetTimer() Should Not Be Used in Console ApplicationsPSS ID Number: 102482
This article was previously published under Q102482
SUMMARY
SetTimer() was not designed to be used with a console application because it requires a message loop to dispatch the timer signal to the timer procedure. In a console application, this behavior can be easily emulated with a thread that is set to wait on an event.
Конечно, она для консольного проложения, в связи с чем вопрос. В сервисе есть цикл обработки сообщений? Будет ли там корректно работать таймер, созданный через SetTimer()?
dmitry501 (2005-07-11 05:50:00) [1]Да, в процессе работы и отладки осознал
Alex Konshin © (08.07.05 11:48) [8]
А не проще использовать WaitableTimer и/или всякие WaitFor* ?
Есть же куча других возможностей, почему обязательно таймер?
Сделал через waitable timer. Получилось просто и работает хорошо. Спасибо.
Alex Konshin (2005-07-08 23:38:00) [2]alpet © (08.07.05 14:28) [12]
В принципе сам цикл и не обязателен. Можно просто вызвать GetMessage (Msg, 0, WM_TIMER, WM_TIMER) - приложение будет благополучно ждать до появления сообщения.
Ждать-то оно будет замечательно, причем даже тогда, когда ты захочешь завершить или перезапустить свой сервис или выдашь shutdown для компьютера. О чем и речь. Этого ожидания недостаточно. Можно, конечно, выдавать terminate для нити извне, но, извините, это не наш метод.
alpet (2005-07-08 14:28:00) [3]Alex Konshin © (08.07.05 12:52) [11]
В принципе сам цикл и не обязателен. Можно просто вызвать GetMessage (Msg, 0, WM_TIMER, WM_TIMER) - приложение будет благополучно ждать до появления сообщения.
Alex Konshin (2005-07-08 12:52:00) [4]Чего ж дешевого, если нужно устраивать цикл выборки сообщений?
Вот ты организуешь цикл, а потом заметишь, что твой сервис не хочет завершаться по требованию. Тебе все равно придется вставить посылку каких-то служебных сообщений для того, чтоб сказать нити, что нужно завершаться или выполнить какие-то другие команды. Ну и зачем этот огород городить? Тебе просто достаточно сделать один цикл с WaitFor*, который ждет Event, который отвечает за завершение (и какие-то другие команды, если нужно), и либо WaitableTimer, либо просто установить нужный таймаут в WaitFor*. И все, ничего больше и не нужно.
alpet (2005-07-08 12:49:00) [5]dmitry501 © (08.07.05 12:28) [9]
Было бы наверное проще использовать "Назначение заданий". Создал расписание, указал программу и все.
dmitry501 (2005-07-08 12:28:00) [6]Alex Konshin © (08.07.05 11:48) [8]
Я уже готовое приложение переделываю. Задача, которая решается с помощью этого таймера- периодически (два раза в сутки) считывается значение температуры воздуха и пишется в базу. Таймер вроде дешево и сердито.
Alex Konshin (2005-07-08 11:48:00) [7]А не проще использовать WaitableTimer и/или всякие WaitFor* ?
Есть же куча других возможностей, почему обязательно таймер?
Digitman (2005-07-07 10:50:00) [8]в OnExecute:
TimerId := SetTimer(0, 0, период, @MyTimerProc);
try
while not Terminated do
ServiceThread.ProcessRequests(True);
finally
KillTimer(0, TimerId);
end;
dmitry501 (2005-07-07 10:42:00) [9]Digitman © (07.07.05 10:40) [5]
Про окна я написал в ответ на [1]
dmitry501 (2005-07-07 10:40:00) [10]Digitman © (07.07.05 10:37) [3]
Спасибо.
Буду делать свой цикл.
Digitman (2005-07-07 10:40:00) [11]
> dmitry501 © (07.07.05 10:35) [2]
> Сервис стартует, когда еще нет десктопа. Можно ли создавать
> окна?
а зачем они нужны сервису, эти окна ?
When you specify a TimerProc callback function, the DispatchMessage function simply calls the callback function instead of the window procedure
Digitman (2005-07-07 10:37:00) [12]ничто не мешает в конс.процессе в любом из трэдов организовать message loop
> В сервисе есть цикл обработки сообщений?
если речь идет о TServiceApplication, то цикл этот там организован только для осн.трэда сервис-процесса (см. TServiceApplication.Run)
трэды же каждого из сервисов в контексте сервис-процесса ответственны за самостоятельную организацию таких циклов, если это необходимо
> Будет ли там корректно работать таймер, созданный через
> SetTimer()?
да, будет.
и TTimer тоже будет
dmitry501 (2005-07-07 10:35:00) [13]antdrnc © (07.07.05 10:33) [1]
Сервис стартует, когда еще нет десктопа. Можно ли создавать окна?
antdrnc (2005-07-07 10:33:00) [14]Если создать невидимое окно то у него будет цикл обработки сообщений.
Есть еще WaitableTimers, они значительно более точные,
может стоит обратить внимание на них?