Таймер в Service

  • Автор темы SNike
  • Дата начала
S

SNike

Тебуется альтернатива компоненту для TTimer. Подскажите что лучше использовать. Приложение работает как служба, в котором создается некоторое количество потоков. В этих потоках и нужно организовывать задержки. Sleep тоже не подходит, т.к. "замораживает" поток. Посоветуйте альтернативу...
 
B

Barmutik

А почему не подходит Sleep? Что конкретно надо сделать?
 
S

SNike

Sleep, похоже, полностью замораживает поток, и пока он сам не проснется - его не разбудить.
Служба создает 10-15 потоков, в каждом потоке с некоторой периодичностью, пусть скажем раз в 30 секунд, необходимо выполнять некоторые действия. Тогда можно оформить это так:
Код:
Repeat
DoWork;
Sleep(30*1000);
Until Terminated

Однако, если попытаться остановить службу, то необходимо остановить и уничтожить все созданные потоки, а Sleep эти потоки "заморозит" и, пока не проснется, поток не завершит свою работу. Т.е. служба будет останавливаться довольно долго, и может возникнуть ситуация с сообщением что служба не ответила за определенный отрезок времени
 
Z

zubr

Так в чем проблема, проверяй поток чаще (к примеру через 30 мс):
Код:
var
counter:Integer;

counter:=GetTickCount;
Repeat
DoWork;
While GetTickCount-counter<30000 do
begin
If Terminated then
exit;
Sleep(30);
end;
counter:=GetTickCount;
Until Terminated
 
S

SNike

Да, точно! Просто и эффективно.
Я уже было подумывал над WaitForSingleObject, WaitableTimer, но они создают дополнительные потоки чего мне не особо хотелось бы, т.к., если не ошибаюсь, не рекомендуется создавать более 15 - 16 потоков.

И, кстати, еще вопрос по теме: сильно ли загружает Sleep процессор? И что более предпочтительней для потоков в службе - Sleep, WaitForSingleObject, WaitableTimer или еще какие-либо способы?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!