Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dienst stop nicht (https://www.delphipraxis.net/152191-dienst-stop-nicht.html)

franktron 14. Jun 2010 16:25

Dienst stop nicht
 
Mein Dienst will nicht stoppen

Delphi-Quellcode:

procedure TKas_Server.DoRun;
Var
  XML_Server : Txml_kas_server;
begin
  FIsDebugFile:=True;
  Recon:=False;
  ShortDateFormat:='dd.mm.yyyy';
  DateSeparator:='.';
  TimeSeparator:=':';
  DecimalSeparator:=',';

  ShowStatus('KAS Server V1.2','');

  ShowStatus('PLUGINS Start','');

  XML_Server:=Txml_kas_server.Create;
  XML_Server.DBServer:=FServerClass.DBServer;
  XML_Server.DBUserName:=FServerClass.DBUserName;
  XML_Server.DBPassword:=FServerClass.DBPassword;
  XML_Server.DBDatabase:=FServerClass.DBDatabase;
  XML_Server.DebugLevel:=FServerClass.DebugLevel;
  XML_Server.OnStatus:=ShowStatus;
  XML_Server.UpdTable;
  XML_Server.StartDay;
  XML_Server.Free;

  Run:=True;
  ShowStatus('RUN','');
  While Run do
  Begin
    try
      If IDatum<>Date then //Tages Wechsel
      Begin
        ShowStatus('Tages Start');
        IDatum:=Date;

        If (AktMonat<>StrToInt(FormatDateTime('mm',Date))) Then
        Begin
          AktJahr:=StrToInt(FormatDateTime('yyyy',Date));
           AktMonat:=StrToInt(FormatDateTime('mm',Date));
        End;

        Try
          XML_Server:=Txml_kas_server.Create;
          XML_Server.DBServer:=FServerClass.DBServer;
          XML_Server.DBUserName:=FServerClass.DBUserName;
          XML_Server.DBPassword:=FServerClass.DBPassword;
          XML_Server.DBDatabase:=FServerClass.DBDatabase;
          XML_Server.DebugLevel:=FServerClass.DebugLevel;
          XML_Server.OnStatus:=ShowStatus;
          XML_Server.UpdTable;
          XML_Server.StartDay;
          XML_Server.Free;
        Finally

        End;
      End;
      Sleep(500);
      If Not Recon then
      Begin
        FServerClass.Reconnect;
        Recon:=True;
      End;
    except
      on E: Exception do
        Begin
        ShowStatus(E.Message);
        End;
    End;
  End;
  // stop program loop
  Run:=False;
end;

procedure Tkas_service.ServiceExecute(Sender: TService);
begin
   KAS_Server1.ShowStatus('Service Run');
   KAS_Server1.DoRun;
end;

procedure Tkas_service.ServiceStart(Sender: TService; var Started: Boolean);
begin
   kas_server1:=TKas_Server.Create;
  KAS_Server1.FIsDebugFile:=True;
  KAS_Server1.ShowStatus('Service Start');
  Started:=True;
end;

procedure Tkas_service.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
   KAS_Server1.ShowStatus('Service Stop');
  KAS_Server1.Run:=False;
  kas_server1.Free;
  Stopped := True;
end;
was habe ich falsch gemacht

P.S. in meiner Logfile wird das Stop Service nicht reingeschreiben

Klaus01 14. Jun 2010 16:47

AW: Dienst stop nicht
 
Hallo Frank,

steht denn etwas von Deinem Service in der Ereignisanzeige?
Welchen Status hat Dein Service wenn Du die Services listest?

Grüße
Klaus

SirThornberry 14. Jun 2010 16:55

AW: Dienst stop nicht
 
Ich denke der Grund ist deine Endlosschleife im DoRun:
Delphi-Quellcode:
While Run do
Begin
  [...]
End;
// stop program loop
Run:=False;
Run wird innerhalb der While-Schleife nirgends auf False gesetzt soweit ich das sehe und entsprechend wird die Schleife nie beendet.

franktron 15. Jun 2010 07:53

AW: Dienst stop nicht
 
Nein aber im Stop Ereignis vom Service
aber ich hab mal gedebugt und das ServcieStop wird gar nicht angesprungen

Der.Kaktus 15. Jun 2010 07:59

AW: Dienst stop nicht
 
Hallo,


schau Dir mal die Antwort auf Deine Frage von "SirThornberry" an. Da steht es nämlich drin :wink:

franktron 15. Jun 2010 09:34

AW: Dienst stop nicht
 
Wenn ich das so machen geht das aber auch nicht
Delphi-Quellcode:
procedure Tkas_service.ServiceExecute(Sender: TService);
begin
   KAS_Server1.ShowStatus('Service Run');
   //KAS_Server1.DoRun;
  while Not Terminated do
  Begin
    sleep(10);
  End;
end;

himitsu 15. Jun 2010 09:37

AW: Dienst stop nicht
 
Terminated wird True, wenn Terminate aufgerufen wurde ... wo wird dieses aufgerufen?

Deine
Delphi-Quellcode:
While Run do
-Schleife wird verlassen, wenn Run auf False gesetzt wird ... wo wird Run auf False gesetzt?

Bzw. Stopped wird im "Beenden"-Ereignis (ServiceStop) gesetzt, aber wo wertest du dieses, in deiner Programmschleife, aus?

usw.


Es bringt nichts irgendwas auszuwerten, was nie gesetzt wird
oder irgendwas zu setzen, welches nie ausgewertet wird.

DeddyH 15. Jun 2010 09:43

AW: Dienst stop nicht
 
And now for something completely different... die Passage
Zitat:

Delphi-Quellcode:
        Try
          XML_Server:=Txml_kas_server.Create;
          XML_Server.DBServer:=FServerClass.DBServer;
          XML_Server.DBUserName:=FServerClass.DBUserName;
          XML_Server.DBPassword:=FServerClass.DBPassword;
          XML_Server.DBDatabase:=FServerClass.DBDatabase;
          XML_Server.DebugLevel:=FServerClass.DebugLevel;
          XML_Server.OnStatus:=ShowStatus;
          XML_Server.UpdTable;
          XML_Server.StartDay;
          XML_Server.Free;
        Finally

        End;

sollte wohl besser etwas umgeschrieben werden.
Delphi-Quellcode:
XML_Server:=Txml_kas_server.Create;      
        Try
          XML_Server.DBServer:=FServerClass.DBServer;
          XML_Server.DBUserName:=FServerClass.DBUserName;
          XML_Server.DBPassword:=FServerClass.DBPassword;
          XML_Server.DBDatabase:=FServerClass.DBDatabase;
          XML_Server.DebugLevel:=FServerClass.DebugLevel;
          XML_Server.OnStatus:=ShowStatus;
          XML_Server.UpdTable;
          XML_Server.StartDay;
        Finally
          XML_Server.Free;
        End;

SirThornberry 15. Jun 2010 09:44

AW: Dienst stop nicht
 
Meine nächste Vermutung, bei der ich mir aber nicht sicher bin ist, dass ganz keine Möglichkeit besteht das jemals ein Stop bei deinem Service ankommt.
Denn du hast da deine Endlosschleife und darin maximal ein Sleep. Aber nirgendwo verarbeitest du Nachrichten oder dergleichen.
Das ist wie in einer normalen Anwendung. Wenn du dort eine Endlosschleife drin hast welche keine Nachrichten verarbeitet, kann man auch auf schließen klicken wie man will und es passiert nichts weil die Nachrichten vom Programm nie verarbeitet werden.

[Edit]
Hab mal fix gesucht und ich glaub dir fehlt sowas:
Delphi-Quellcode:
while not Terminated do
begin
  [...]
  ServiceThread.ProcessRequests(False);
end;
[/Edit]

franktron 15. Jun 2010 09:48

AW: Dienst stop nicht
 
Ich hab den Fehler

Das

Delphi-Quellcode:
ServiceThread.ProcessRequests(False);
Fehlte im ServiceExecute muss eine Schleife mit dem Befehl drin stehen sonst gehts nicht


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