Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#26

Re: Eigener Dienst beendet nicht korrekt...

  Alt 30. Apr 2009, 10:04
Hallo,

mit dem Abbruch der For-Schleife hatte ich mir in dieser Form vorgestellt:
Delphi-Quellcode:
unit SVReplikationUnit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  DB, ADODB, ExtCtrls, Registry, StrUtils;

type
  TReplikator = class(TService)
    tm: TSpecialTimer;
    acABC: TADOConnection;
    acBN: TADOConnection;
    qryBN: TADOQuery;
    qryABC: TADOQuery;
    qryBNMaxUhrzeit: TADOQuery;
    qryABCMaxUhrzeit: TADOQuery;
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
    procedure tmTimer(Sender: TObject);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServiceShutdown(Sender: TService);
    procedure ServiceBeforeInstall(Sender: TService);
    procedure ServiceAfterUninstall(Sender: TService);
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
    bShutDownOrStopOrPause : Boolean;
  end;

var
  TReplikatorReplikator: TReplikator;

implementation

{$R *.DFM}

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

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

procedure TReplikator.ServiceCreate(Sender: TObject);
begin
  // ShortDateFormat := 'yyyy-mm-dd'; // Darf nicht gesetzt werden, da auch die Datenbankinhalte übersetzt werden.
  ThousandSeparator := ','; // Muss gesetzt werden, da die Datenbank Komma erwartet.
  DecimalSeparator := '.'; // Muss gesetzt werden, da die Datenbank Punkt erwartet.
  bShutDownOrStopOrPause := False;
end;

procedure TReplikator.ServiceExecute(Sender: TService);
begin
  while not Terminated do ServiceThread.ProcessRequests(True);
end;

procedure TReplikator.tmTimer(Sender: TObject);
Var
          i : Integer;
begin
  tm.Enabled := False;
  // Hier passiert so allerhand, was auch 'ne Weile dauern kann.
  For i := 0 to MaxInt do begin
    // Ist der Abbruchschalter gesetzt, dann aufhören.
    // if i Mod 100 = 0 then // wenn nicht bei jedem Schleifendurchlauf geprüft werden soll.
    if bShutDownOrStopOrPause then Break;
  end;
  tm.Enabled := True;
end;

procedure TReplikator.ServiceStart(Sender: TService; var Started: Boolean);
Var
          iOffset : Integer;
begin
  tm.Enabled := True;
  bShutDownOrStopOrPause := False;
end;

procedure TReplikator.ServicePause(Sender: TService; var Paused: Boolean);
begin
  tm.Enabled := False;
  bShutDownOrStopOrPause := True;
end;

procedure TReplikator.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  tm.Enabled := False;
  bShutDownOrStopOrPause := True;
end;

procedure TReplikator.ServiceContinue(Sender: TService; var Continued: Boolean);
Var
          iOffset : Integer;
begin
  tm.Enabled := True;
  bShutDownOrStopOrPause := False;
end;

procedure TReplikator.ServiceShutdown(Sender: TService);
begin
  tm.Enabled := False;
  bShutDownOrStopOrPause := True;
end;

// Messagefile registrieren
procedure TReplikator.ServiceBeforeInstall(Sender: TService);
Var
    Reg : TRegistry;
begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  Reg.OpenKey('system\CurrentControlSet\Services\EventLog\Application\' + Self.Name,True);
  Reg.WriteString('EventMessageFile',ParamStr(0));
  Reg.WriteInteger('TypesSupported',7);
  Reg.CloseKey;
  Reg.OpenKey('system\CurrentControlSet\Services\TReplikator\' + Self.Name,True);
  Reg.WriteString('Description','Repliziert die Daten zwischen den Datenbanken ABC und BN');
  Reg.CloseKey;
  Reg.Free;
end;

// Messagefile aus Registrierung entfernen
procedure TReplikator.ServiceAfterUninstall(Sender: TService);
Var
    Reg : TRegistry;
begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  Reg.DeleteKey('system\CurrentControlSet\Services\EventLog\Application\' + Self.Name);
  Reg.DeleteKey('system\CurrentControlSet\Services\TReplikatorReplikator\' + Self.Name);
  Reg.CloseKey;
  Reg.Free;
end;

end.
Das ist nicht getestet, sondern nur schnell aus einem vorhandenen Service zusammengedaddelt. Hoffe trotzdem, dass es Dir bei der Problemlösung weiterhilft.
  Mit Zitat antworten Zitat