Главная страница
    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.041 c
8-1112443806
dimka@cs
2005-04-02 16:10
2005.08.28
уровень громкости


3-1121682484
S_s
2005-07-18 14:28
2005.08.28
QuickRepotr: составление отчета


3-1121407660
Леха
2005-07-15 10:07
2005.08.28
Запрос на выборку похожих записей.


4-1120802825
Jupiter
2005-07-08 10:07
2005.08.28
Как проигнорировать уведомление об ошибке при копировании


11-1106119944
Ajax
2005-01-19 10:32
2005.08.28
Default button





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский