Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.054 c
11-1106216023
Эдик
2005-01-20 13:13
2005.08.28
Refresh и дополнительная форма


14-1123263982
SergP
2005-08-05 21:46
2005.08.28
Еще раз об БД Access


14-1122974932
Ajax
2005-08-02 13:28
2005.08.28
beat detection algorithms


14-1122743563
MaksimkaP
2005-07-30 21:12
2005.08.28
Прокси сервер


11-1106057807
Slay
2005-01-18 17:16
2005.08.28
Thread.OnDestroy





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский