AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Dienst selbst beenden bei Fehler
Thema durchsuchen
Ansicht
Themen-Optionen

Dienst selbst beenden bei Fehler

Ein Thema von Susanne · begonnen am 10. Dez 2004 · letzter Beitrag vom 11. Jan 2005
Antwort Antwort
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#1

Dienst selbst beenden bei Fehler

  Alt 10. Dez 2004, 07:16
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.
Susanne
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: Dienst selbst beenden bei Fehler

  Alt 10. Dez 2004, 07:21
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Dienst selbst beenden bei Fehler

  Alt 10. Dez 2004, 07:26
ja, ich frage in der Schleife immer ab, ob not Terminated, er müsste sie also verlassen
Susanne
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#4

Re: Dienst selbst beenden bei Fehler

  Alt 26. Dez 2004, 15:10
Kannst du mal in Ausschnitten die Struktur des Dienstes hier reinstellen. Einsprungspunkt des SCM und des Threads wären zB wichtig.
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Dienst selbst beenden bei Fehler

  Alt 10. Jan 2005, 14:29
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?
Susanne
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#6

Re: Dienst selbst beenden bei Fehler

  Alt 11. Jan 2005, 13:58
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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