对于Windows服务,我需要一个定时器来定期执行某项任务。当然,有许多选项似乎比定时器更优越(多线程,直接从服务的主线程调用方法),但在这种特定情况下,它们都有缺点。
然而,由于明显的原因,没有GUI的消息队列,SetTimer()无法工作。我已经在Free Pascal中完成了以下操作:
创建定时器:
在服务的主循环中,运行计时器队列:
除了KillTimer总是返回False之外,这个代码如预期一样工作。但我很想听取你的反馈,确保我的实现是正确的——我只是想避免因为我对消息处理的经验不足而影响其他应用程序的消息和产生其他副作用。谢谢!
然而,由于明显的原因,没有GUI的消息队列,SetTimer()无法工作。我已经在Free Pascal中完成了以下操作:
创建定时器:
MyTimerID := SetTimer(0, 0, 3333, @MyTimerProc);
在服务的主循环中,运行计时器队列:
procedure TMyServiceThread.Execute;
var
AMessage: TMsg;
begin
repeat
// Some calls
if PeekMessage(AMessage, -1, WM_TIMER, WM_TIMER, PM_REMOVE) then begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
// Some more calls
TerminateEventObject.WaitFor(1000);
until Terminated;
end;
最后,停止计时器:
KillTimer(0, MyTimerID)
除了KillTimer总是返回False之外,这个代码如预期一样工作。但我很想听取你的反馈,确保我的实现是正确的——我只是想避免因为我对消息处理的经验不足而影响其他应用程序的消息和产生其他副作用。谢谢!