Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fehlermeldung beim Stoppen eines Service (https://www.delphipraxis.net/81782-fehlermeldung-beim-stoppen-eines-service.html)

harald44 3. Dez 2006 20:54


Fehlermeldung beim Stoppen eines Service
 
Hallo Zusammen

Habe eine ServiceAnwendung erstellt (TServiceApplication). Beim Stoppen der ServiceAnwendung über Computerverwaltung/Dienste erhalte ich folgende Windows-Fehlermeldung
"Der Dienst Service1 konnte nicht beendet werden. Der Dienst hat keinen Fehler zurückgegeben ...."

Was habe ich vergessen ???

Danke

thkerkmann 3. Dez 2006 21:24

Re: Fehlermeldung beim Stoppen eines Service
 
Hi,

Was Du vergessen hast ?

Ein wenig Information wie dein Dienst aufgebaut ist - damit wir dir helfen können.

Zeig mal etwas Code.

Gruss

harald44 4. Dez 2006 18:11

Re: Fehlermeldung beim Stoppen eines Service
 
Hi thkerkmann
Es ist nur ein kleiner TestService.
Hier der Code :

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TService1 = class(TService)
    procedure ServiceExecute(Sender: TService);
    procedure ServiceShutdown(Sender: TService);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    stopServ : Boolean;
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  Service1: TService1;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TService1.ServiceExecute(Sender: TService);

var
  sleepCnt : Integer;

begin
  AllowStop := true;
  stopServ := false;
  sleepCnt := 0;
  while not stopServ do
  begin
    sleep(100);
    inc(sleepCnt);
    if (not stopServ) AND (sleepCnt >= 10) then
    begin
      sleepCnt := 0;
      beep;
    end;
  end;
end;


procedure TService1.ServiceShutdown(Sender: TService);
begin
  stopServ := true;
  self.ServiceThread.Terminate;
  ErrCode := 0;
  Win32ErrCode := 0;
  MessageBeep(2);
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  stopServ := true;
  ErrCode := 0;
  Win32ErrCode := 0;
  stopped := true;
end;

end.

thkerkmann 4. Dez 2006 18:36

Re: Fehlermeldung beim Stoppen eines Service
 
Hallo,

da lass mal das

Delphi-Quellcode:
Self.ServiceThread.Terminate;
lieber weg, der ist nämlich schon weg wenn Shutdown kommt.

Du hast ja keinen Thread selber abgespalten, den du verwalten musst.

Gruss

SirThornberry 4. Dez 2006 18:38

Re: Fehlermeldung beim Stoppen eines Service
 
ich würde es schlicht und einfach auf deine Endlosschleife schieben.

harald44 4. Dez 2006 19:28

Re: Fehlermeldung beim Stoppen eines Service
 
Hi thkerkmann
Das Problem tritt auch ohne diese Zeile auf, habe sie erst eingefügt wegem dem Problem.
Delphi-Quellcode:
self.ServiceThread.Terminate;
Hi SirThornberry
Du musst in der Methode "ServiceExecute" etwas performance brauchen. Ansonsten Stoppt windows den Service sofort wieder.

harald44 4. Dez 2006 19:39

Re: Fehlermeldung beim Stoppen eines Service
 
Habe noch ne info vergessen
Der "beep", letzte Zeile in Methode "ServiceShutdown" ist nicht zu hören. Es scheint diese Methode wird überhaupt nicht aufgerufen. (Sie ist im DFM-File Deklariert).
code DFM-File :

Delphi-Quellcode:
object Service1: TService1
  OldCreateOrder = False
  DisplayName = 'Service1'
  Interactive = False
  OnExecute = ServiceExecute
  OnShutdown = ServiceShutdown
  OnStop = ServiceStop
  Left = 300
  Top = 199
  Height = 540
  Width = 783
end

thkerkmann 4. Dez 2006 20:48

Re: Fehlermeldung beim Stoppen eines Service
 
Mein Gott jetzt hab ichs....

Es fehlt tatsächlich was. Da du keinen eingenen Thread abspaltest, hast du mit deiner Execute Methode natürlich sowas wie eine Endlosschleife, und die Anweisungen an den Service können gar nicht verarbeitet werden.

Du musst in diese Schleife ähnlich wie bei GUI programmen sowas wie Application.ProcessMessages einbauen.

Im Service heist das dann ServiceThread.ProcessRequests(false);

Also:
Delphi-Quellcode:
procedure TService1.ServiceExecute(Sender: TService);
var
  sleepCnt: Integer;
begin
  AllowStop := true;
  stopServ := false;
  sleepCnt := 0;
  while not stopServ do
  begin
    sleep(100);
    inc(sleepCnt);
    if (not stopServ) and (sleepCnt >= 10) then
    begin
      sleepCnt := 0;
      beep;
    end;
    ServiceThread.ProcessRequests(false);
  end;
end;
Dann sollte es gehen.

Gruss


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