Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Dienst und Timer (https://www.delphipraxis.net/206369-dienst-und-timer.html)

MechMac666 15. Dez 2020 07:19

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

Delphi.Narium 15. Dez 2020 11:23

AW: Dienst und Timer
 
Zitat:

Zitat von MechMac666 (Beitrag 1479110)
Nun lese ich aber in (alten) Threads das ein Timer wohl gelegentlich nicht auslösen soll.

Das ist mir bisher (über etliche Jahre hinweg) noch bei keinem Dienst mit Timersteuerung passiert.

himitsu 15. Dez 2020 15:00

AW: Dienst und Timer
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1479122)
Das ist mir bisher (über etliche Jahre hinweg) noch bei keinem Dienst mit Timersteuerung passiert.

Das ist auch nicht so leicht möglich, mit einem TService im Delphi.

Ein TTimer erstellt ein eigenes MessageOnly-Window (Delphi-Referenz durchsuchenAllocateHWnd) im Hauptthread (HInstance), über welches die Timer-Messages laufen.

TService erstellt einen Thread (TServiceStartThread), in dem der MSDN-Library durchsuchenStartServiceCtrlDispatcher 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.

Delphi.Narium 15. Dez 2020 15:56

AW: Dienst und Timer
 
Zitat:

Zitat von himitsu (Beitrag 1479141)
Demnach ist die Wahrscheinlichkeit geringer, dass die Message des Timer nicht verarbeitet werden kann, aber wenn doch, dann ist es die Schuld des Entwicklers.

Wenn ich diesen Satz richtig interpretiere, spricht also nichts gegen die Verwendung von Timern in einem Service, was für den Threadersteller ja bedeuten würde, dass er sich wegen seiner bisherigen Vorgehensweise keine Sorgen zu machen braucht.

himitsu 15. Dez 2020 15:58

AW: Dienst und Timer
 
mmmmmmja

So lange er nicht durch irgendwas Anderes den Hauptthread blockiert. (Entslosschleife oder Deadlock in einem eigenen Code im Hauptthread)

Delphi.Narium 15. Dez 2020 16:06

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:

Zitat von himitsu
dann ist es die Schuld des Entwicklers

kann ausgeschlossen werden.

Bzw.: Ein derartiger Service würde, auch ohne Timer, vermutlich nicht vernünftig laufen ;-)

HolgerX 15. Dez 2020 16:53

AW: Dienst und Timer
 
Hmm..

Wenn es nicht zu genau sein soll, reicht auch eigentlich:

Delphi-Quellcode:
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;
Damit hast Du einen ~20 Sekundentimer ;)

Ganz ohne Messages..

MechMac666 18. Dez 2020 22:13

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 18:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf