![]() |
Dienst selbst beenden bei Fehler
Hallo,
Mein Problem sieht im Moment so aus. Ich habe einen Dienst, der läuft auch soweit hervorragend. Nun möchte ich aber noch erreichen, dass wenn innerhalb des Dienstes ein Fehler auftritt, der Dienst sich selbst beendet bisher hatte ich das versucht; der Dienst selbst ist in einem Thread.
Delphi-Quellcode:
Aber das Ergebnis ist, dass er immernoch weiter im TaskManager angezeigt wird und unter Dienste steht er mit dem Status 'wird beendet', aber da kann man stundenlang warten und nichts weiter passiert.
ServiceStop('.', 'Dienst', False);
Terminate; Wie kann ich nun realisieren, dass er sich wirklich beendet. |
Re: Dienst selbst beenden bei Fehler
Du hast du bestimmt in dem Thread ne Schleife oder so. Hast du dort auch while not Terminated drin? Da sonst die Schleife ja nie beendet wird.
|
Re: Dienst selbst beenden bei Fehler
ja, ich frage in der Schleife immer ab, ob not Terminated, er müsste sie also verlassen
|
Re: Dienst selbst beenden bei Fehler
Kannst du mal in Ausschnitten die Struktur des Dienstes hier reinstellen. Einsprungspunkt des SCM und des Threads wären zB wichtig.
|
Re: Dienst selbst beenden bei Fehler
ich habe einmal die Unit Dienst mit diesen drei Funktionen:
Delphi-Quellcode:
//Initialisierung des Services
procedure Service.ServiceStart(Sender: TService; var Started: Boolean); begin //hier Aufruf des Threads TMThread:= Thread.Create(false); end; //DeInitialisierung des Services procedure Service.ServiceStop(Sender: TService; var Stopped: Boolean); begin if Assigned(TMThread) then begin {TMThread.Terminated;} TMThread.Terminate; //Freigeben des Threads FreeAndNil(TMThread); end; end; //Steuerung des Dienstes procedure Service.ServiceExecute(Sender: TService); begin //solange nicht beendet wurde while not Terminated do ServiceThread.ProcessRequests(True); end; aus einem anderen Programm wird die Methode ServiceStart aufgerufen zum starten des Dienstes und die Methode ServiceStop, um den Dienst zu stoppen Dann gibt es die Unit Thread mit diesen Funktionen:
Delphi-Quellcode:
In Thread.Execute wird die Methode TimeTimer aufgerufen, die auch wieder andere Funktionen aufgeruft. Wenn dort irgendwo dann ein Fehler auftritt, dann soll sich der Dienst beenden. Wie mache ich das?
constructor Thread.Create(CreateSuspended: Boolean);
begin inherited Create(CreateSuspended); Priority := tpLowest; end; procedure Thread.Execute; begin FormCreate; while not Terminated do TimerTimer(self); Timer.Free; ClockTimer.Free; end; procedure Thread.Terminate; begin Interrupted:= true; while not(BlockAbarbeitungFertig) do begin sleep(1000); end; FormCloseQuery; end; |
Re: Dienst selbst beenden bei Fehler
Nunja, TimerTimer() wird ja wissen, wenn ein Fehler auftaucht, man müßte also die Bedingung nur so schreiben:
Delphi-Quellcode:
TimerTimer gibt also einen Boolean-Wert zurück (True = Erfolg, False = Fehler) und Sleep(0) verbessert ein wenig das Laufzeitverhalten deines Dienstes, weil so die CPU-Auslastung die dein Dienst erzeugt ein wenig runtergenommen wird. Sleep(0) gibt Rechenzeit an den nächsten Thread in der Zeitscheibe ab.
while ((not Terminated) and TimerTimer(self)) do
Sleep(0); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz