Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование таймера в сервисе/службе


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, они значительно более точные,
может стоит обратить внимание на них?


Наверх

Титульная страница Поиск, карта сайта Написать письмо