Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизИспользование таймера в сервисе/службе Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c