type
TWorkerThread = class(TThread)
private
FPaused: Boolean;
protected
procedure Execute; override;
public
procedure Pause;
procedure Continue;
end;
implementation
uses
System.SysUtils, System.ioutils;
procedure TWorkerThread.Continue;
begin
FPaused := False;
end;
procedure TWorkerThread.Execute;
var
ExePath, LogFileName: string;
Log: TStreamWriter;
begin
try
FPaused := False;
ExePath := TPath.GetDirectoryName(GetModuleName(HInstance));
LogFileName := TPath.Combine(ExePath,
ClassName + '_' + IntToStr(CurrentThread.ThreadID) + '.txt');
Log := TStreamWriter.Create(TFileStream.Create(LogFileName, fmCreate or fmShareDenyWrite));
try
while not Terminated do
begin
if not FPaused then
begin
Log.WriteLine('Message from thread: ' + TimeToStr(now));
end;
TThread.Sleep(1000);
end;
finally
Log.Free;
end;
except
on E: Exception do
begin
TFile.WriteAllText(TPath.Combine(ExePath, 'CRASH_LOG.TXT'), E.ClassName + ' ' + E.Message);
end
end;
end;
procedure TWorkerThread.Pause;
begin
FPaused := True;
end;
end.
///////////////////以下是服务单元///////////////////////////////////
unit ServiceU;
type
TSampleService = class(TService)
procedure ServiceExecute(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceAfterInstall(Sender: TService);
private
FWorkerThread: TWorkerThread;
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
{$R *.dfm}
var
SampleService: TSampleService;
implementation
uses
System.Win.Registry;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
SampleService.Controller(CtrlCode);
end;
function TSampleService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TSampleService.ServiceAfterInstall(Sender: TService);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + name, false) then
begin
Reg.WriteString('Description', 'My Fantastic Windows Service');
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
procedure TSampleService.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
FWorkerThread.Continue;
Continued := True;
end;
procedure TSampleService.ServicePause(Sender: TService; var Paused: Boolean);
begin
FWorkerThread.Pause;
Paused := True;
end;
procedure TSampleService.ServiceStart(Sender: TService; var Started: Boolean);
begin
FWorkerThread := TWorkerThread.Create(True);
FWorkerThread.Start;
Started := True;
end;
procedure TSampleService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
FWorkerThread.Terminate;
FWorkerThread.WaitFor;
FreeAndNil(FWorkerThread);
Stopped := True;
end;
procedure TSampleService.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
ServiceThread.ProcessRequests(false);
TThread.Sleep(1000);
end;
end;