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!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage