Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

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

 
dmitry501 ©   (2005-07-07 10:25) [0]

Переделываю программу, в которой используются таймеры в службу.
Посмотрел в 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()?


 
antdrnc ©   (2005-07-07 10:33) [1]

Если создать невидимое окно то у него будет цикл обработки сообщений.
Есть еще WaitableTimers, они значительно более точные,
может стоит обратить внимание на них?


 
dmitry501 ©   (2005-07-07 10:35) [2]

antdrnc ©   (07.07.05 10:33) [1]
Сервис стартует, когда еще нет десктопа. Можно ли создавать окна?


 
Digitman ©   (2005-07-07 10:37) [3]

ничто не мешает в конс.процессе в любом из трэдов организовать message loop


> В сервисе есть цикл обработки сообщений?


если речь идет о TServiceApplication, то цикл этот там организован только для осн.трэда сервис-процесса (см. TServiceApplication.Run)

трэды же каждого из сервисов в контексте сервис-процесса ответственны за самостоятельную организацию таких циклов, если это необходимо


> Будет ли там корректно работать таймер, созданный через
> SetTimer()?


да, будет.

и TTimer тоже будет


 
dmitry501 ©   (2005-07-07 10:40) [4]

Digitman ©   (07.07.05 10:37) [3]
Спасибо.
Буду делать свой цикл.


 
Digitman ©   (2005-07-07 10:40) [5]


> 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


 
dmitry501 ©   (2005-07-07 10:42) [6]

Digitman ©   (07.07.05 10:40) [5]
Про окна я написал в ответ на [1]


 
Digitman ©   (2005-07-07 10:50) [7]

в OnExecute:

TimerId := SetTimer(0, 0, период, @MyTimerProc);
try
while not Terminated do
  ServiceThread.ProcessRequests(True);
finally
KillTimer(0, TimerId);
end;


 
Alex Konshin ©   (2005-07-08 11:48) [8]

А не проще использовать WaitableTimer и/или всякие WaitFor* ?
Есть же куча других возможностей, почему обязательно таймер?


 
dmitry501 ©   (2005-07-08 12:28) [9]

Alex Konshin ©   (08.07.05 11:48) [8]
Я уже готовое приложение переделываю. Задача, которая решается с помощью этого таймера- периодически (два раза в сутки) считывается значение температуры воздуха и пишется в базу. Таймер вроде дешево и сердито.


 
alpet ©   (2005-07-08 12:49) [10]

dmitry501 ©   (08.07.05 12:28) [9]
Было бы наверное проще использовать "Назначение заданий". Создал расписание, указал программу и все.


 
Alex Konshin ©   (2005-07-08 12:52) [11]

Чего ж дешевого, если нужно устраивать цикл выборки сообщений?
Вот ты организуешь цикл, а потом заметишь, что твой сервис не хочет завершаться по требованию. Тебе все равно придется вставить посылку каких-то служебных сообщений для того, чтоб сказать нити, что нужно завершаться или выполнить какие-то другие команды. Ну и зачем этот огород городить? Тебе просто достаточно сделать один цикл с WaitFor*, который ждет Event, который отвечает за завершение (и какие-то другие команды, если нужно), и либо WaitableTimer, либо просто установить нужный таймаут в WaitFor*. И все, ничего больше и не нужно.


 
alpet ©   (2005-07-08 14:28) [12]

Alex Konshin ©   (08.07.05 12:52) [11]
В принципе сам цикл и не обязателен. Можно просто вызвать GetMessage (Msg, 0, WM_TIMER, WM_TIMER) - приложение будет благополучно ждать до появления сообщения.


 
Alex Konshin ©   (2005-07-08 23:38) [13]

alpet ©   (08.07.05 14:28) [12]
В принципе сам цикл и не обязателен. Можно просто вызвать GetMessage (Msg, 0, WM_TIMER, WM_TIMER) - приложение будет благополучно ждать до появления сообщения.

Ждать-то оно будет замечательно, причем даже тогда, когда ты захочешь завершить или перезапустить свой сервис или выдашь shutdown  для компьютера. О чем и речь. Этого ожидания недостаточно. Можно, конечно, выдавать terminate для нити извне, но, извините, это не наш метод.


 
dmitry501 ©   (2005-07-11 05:50) [14]

Да, в процессе работы и отладки осознал
Alex Konshin ©   (08.07.05 11:48) [8]
А не проще использовать WaitableTimer и/или всякие WaitFor* ?
Есть же куча других возможностей, почему обязательно таймер?

Сделал через waitable timer. Получилось просто и работает хорошо. Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
1-1123585722
rolex
2005-08-09 15:08
2005.08.28
Компонент для ввода IP адреса.


1-1123539701
LeonidB
2005-08-09 02:21
2005.08.28
Подскажите, как заполнить VirtualTreeView.


14-1123066982
Kerk
2005-08-03 15:03
2005.08.28
Где можно IRC-бота захостить?


3-1121678289
Viktor1
2005-07-18 13:18
2005.08.28
Exception сервера об отсутствии прав у пользователя.


1-1123131719
X9
2005-08-04 09:01
2005.08.28
Работа со структурами и DLL.