Timer-Warteschlange im Windows-Dienst
Für einen Windows-Dienst benötige ich einen Zeitgeber, um eine bestimmte Aufgabe regelmäßig auszuführen. Natürlich gibt es viele Optionen, die einem Zeitgeber überlegen erscheinen (Multithreading, Aufrufmethode direkt vom Hauptthread des Dienstes), aber alle haben ihre Nachteile in dieser speziellen Situation.
Aus offensichtlichen Gründen funktioniert SetTimer () jedoch nicht ohne die Nachrichtenwarteschlange einer GUI. Was ich (in Free Pascal) getan habe, ist das Folgende:
Erstellen Sie den Timer:
MyTimerID := SetTimer(0, 0, 3333, @MyTimerProc);
Führen Sie in der Hauptschleife des Dienstes die Zeitgeberwarteschlange aus:
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;
Und am Ende töte den Timer:
KillTimer(0, MyTimerID)
Abgesehen davon, dass KillTimer immer False zurückgibt, funktioniert dies wie erwartet.
Ich bin jedoch an Ihrem Feedback interessiert, wenn meine Implementierung korrekt ist. Ich möchte nur vermeiden, die Nachrichten anderer Anwendungen und andere Nebenwirkungen zu verfälschen, die mir aufgrund meiner Unerfahrenheit im Umgang mit Nachrichten nicht bekannt sind.
Vielen Dank!