Dienst und Timer
Hallo,
ich wollte mal fragen wie denn aktuell die sinnvollste Methode ausschaut um zeitgesteuert eine Aktion in einem Dienst auszulösen. Intervall zwischen 1 und 30 Minuten. Es handelt sich dabei um einen Dienst, welcher auf einem Server (2016) laufen soll. Gegenwärtig nutze ich einen Timer, was auf meinem standard Computer bei Tests einwandfrei funktioniert hat. Nun lese ich aber in (alten) Threads das ein Timer wohl gelegentlich nicht auslösen soll. Zu der Auslastung des Servers kann ich nicht so viel sagen, ist ein SQL Server. Gruß, Andreas |
AW: Dienst und Timer
Zitat:
|
AW: Dienst und Timer
Zitat:
Ein TTimer erstellt ein eigenes MessageOnly-Window (AllocateHWnd) im Hauptthread (HInstance), über welches die Timer-Messages laufen. TService erstellt einen Thread (TServiceStartThread), in dem der StartServiceCtrlDispatcher gestartet wird, da diese Funktion bis zum Programmende nicht zurückkehrt. Darin wird dann ein weiterer Thread gestartet, in dem der Service arbeitet (TService.Execute) Und bei weiteren Servern ala REST, HTTP, DataSnap oder sonstwas, landen die Aufrufe nochmals in weiteren Threads. Ohne Synchronize oder eine Message an den Hauptthread (PostThreadMessage), oder an ein Fenster des Hauptthreads (SendMessage/PostMessage), arbeitet somit niemand "permanent" im Hauptthread. Demnach ist die Wahrscheinlichkeit geringer, dass die Message des Timer nicht verarbeitet werden kann, aber wenn doch, dann ist es die Schuld des Entwicklers. |
AW: Dienst und Timer
Zitat:
|
AW: Dienst und Timer
mmmmmmja
So lange er nicht durch irgendwas Anderes den Hauptthread blockiert. (Entslosschleife oder Deadlock in einem eigenen Code im Hauptthread) |
AW: Dienst und Timer
ok.
Unter keine Sorgen machen verstehe ich, dass der Service so progammiert ist, dass er keine Teile enthält (wissentlich oder unwissentlich), die eine Nutzung von Timern sowieso ausschließen bzw. (annähernd) unmöglich machen, also eigentlich das: Zitat:
Bzw.: Ein derartiger Service würde, auch ohne Timer, vermutlich nicht vernünftig laufen ;-) |
AW: Dienst und Timer
Hmm..
Wenn es nicht zu genau sein soll, reicht auch eigentlich:
Delphi-Quellcode:
Damit hast Du einen ~20 Sekundentimer ;)
procedure TService1.ServiceExecute(Sender: TService);
var tmpTime : TDateTime; begin tmpTime := now; while not Terminated do begin if SecondsBetween(tmpTime, now) >= 20 then begin tmpTime := now; // Mache deine Timeraktion... end; Sleep(1); ServiceThread.ProcessRequests(false); end; end; Ganz ohne Messages.. |
AW: Dienst und Timer
Danke für die Antworten,
mittlerweile läuft der Dienst auf dem Server und es gab bisher keinerlei Probleme. Ich selbst hatte mit Timern auch noch nie Probleme, mich hatten nur diverse Threads verunsichert. Und zeitlich genau muss das in meinem Fall auch nicht sein. Ob die Aktion nun eine Sekunde früher oder später ausgelöst wird ist total egal. Passt also :-) Gruß, Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz