Ich glaube, den Thread selber habe ich am Laufen. Ich habe das ganze jetzt mit einer einfach normalen Anwendung ausprobiert, damit funktioniert es nun, ohne Probleme. Beide Varianten habe keine Timer und nichts unötiges.
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Thread;
type
TForm1 =
class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
TThread: TimeManagerThread;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
TThread:= TimeManagerThread.Create (false);
end;
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if Assigned(TThread)
then
begin
{TMThread.Terminated;}
TThread.Terminate;
//kehrt erst zurück, wenn Thread beendet ist!
//TThread.WaitFor;
//Freigeben des Threads
FreeAndNil(TThread);
end
end;
end.
Damit bin ich mir erst mal sicher, dass der Thread läuft. Nun habe ich das ganze nochmal mit dem Dienst probiert.
Delphi-Quellcode:
unit Dienst;
interface
uses
Windows, Messages, extctrls, WinSvc, SysUtils, Classes, Graphics, Controls,
SvcMgr, ShellAPI, Dialogs, Thread;
type
TTimeManagerService =
class(TService)
{Initialisierung des TimeManagerServices}
procedure ServiceStart(Sender: TService;
var Started: Boolean);
{Deinitialisierung des TimeManagerServices}
procedure ServiceStop(Sender: TService;
var Stopped: Boolean);
{hier erfolgt die Steuerung des Dienstes}
procedure ServiceExecute(Sender: TService);
private
{ Private-Deklarationen }
public
function GetServiceController: TServiceController;
override;
{ Public-Deklarationen }
end;
var
TimeManagerService: TTimeManagerService;
TMThread: TimeManagerThread;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord);
stdcall;
begin
TimeManagerService.Controller(CtrlCode);
end;
function TTimeManagerService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
//Initialisierung des TimeManagerServices
procedure TTimeManagerService.ServiceStart(Sender: TService;
var Started: Boolean);
begin
TMThread:= TimeManagerThread.Create(false);
end;
//DeInitialisierung des TimeManagerServices
procedure TTimeManagerService.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
//Hier müsste dann der TimeManagerTeil CloseQueryForm aufgerufen werden
if Assigned(TMThread)
then
begin
{TMThread.Terminated;}
TMThread.TerminateThread;
//kehrt erst zurück, wenn Thread beendet ist!
//TMThread.WaitFor;
//Freigeben des Threads
FreeAndNil(TMThread);
end;
end;
//Steuerung des Dienstes
procedure TTimeManagerService.ServiceExecute(Sender: TService);
begin
while not Terminated
do
ServiceThread.ProcessRequests(True);
end;
end.
Und hier funktioniert das ganze natürlich nicht richtig. im OnStart habe ich ServiceStart zugeordnet und onstop Servicestop. installieren, deinstallieren macht er, er startet auch, aber es passiert nichts, er müsste eine Anwendung öffnen. Wenn ich dann den Dienst beende kommt folgende Fehlermeldung
Dienst auf lokaler comüuter konnt nicht bendetwerden, Kein Fehler zurück gegeben, kann interne Windows-Fehler sein, oder interner Dienst fehler
Im TaskManager unter Prozesse ist er auch immernoch vorhanden. Wo verflucht nochmal ist denn nun noch was,was ziemlich schief läuft?