Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dienst selbst beenden bei Fehler (https://www.delphipraxis.net/35641-dienst-selbst-beenden-bei-fehler.html)

Susanne 10. Dez 2004 07:16


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:
ServiceStop('.', 'Dienst', False);
   Terminate;
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.

Wie kann ich nun realisieren, dass er sich wirklich beendet.

jim_raynor 10. Dez 2004 07:21

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.

Susanne 10. Dez 2004 07:26

Re: Dienst selbst beenden bei Fehler
 
ja, ich frage in der Schleife immer ab, ob not Terminated, er müsste sie also verlassen

Assarbad 26. Dez 2004 15:10

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.

Susanne 10. Jan 2005 14:29

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:
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;
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?

Assarbad 11. Jan 2005 13:58

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:
while ((not Terminated) and TimerTimer(self)) do
Sleep(0);
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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