Wat ik hier mis is de loop de service zelf. In die loop moet ServiceThread.ProcessRequests aangeroepen worden.
Jij doet dit nu alleen maar 1 keer bij de start. Dat gaat dus niet werken.
En wat is THWP1Reader?
De meest simpele service is dit:
Delphi Code:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs;
type
TService1 = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceExecute(Sender: TService);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
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.ServiceStart(Sender: TService; var Started: Boolean);
begin
LogMessage('HWP1 started', EVENTLOG_AUDIT_SUCCESS, 1, 121);
end;
procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
LogMessage('HWP1 stopped', EVENTLOG_AUDIT_SUCCESS, 1, 122);
end;
procedure TService1.ServiceExecute(Sender: TService);
var
startTime64, endTime64, frequency64: Int64;
elapsedSeconds: single;
begin
QueryPerformanceFrequency(frequency64);
QueryPerformanceCounter(startTime64);
HWP1.Create( ?? );
while not Terminated do
begin
QueryPerformanceCounter(endTime64);
elapsedSeconds := (endTime64 - startTime64) / frequency64;
if elapsedSeconds >= 60 then
begin
HWP1.ReadData; // MOET direct terugkeren
HWP1.Save2DB;
QueryPerformanceCounter(startTime64);
end;
ServiceThread.ProcessRequests(false);
Sleep(100);
end;
HWP1.Free;
end;
end.
De TService1.ServiceExecute MOET dus een loop bevatten waar je ServiceThread.ProcessRequests aanroept.
Als je echt een aparte class wilt maken voor THWP1, dan moet die of
1) de THWP1.Read direct terugkeren naar de loop van de service
2) in de loop van THWP1 een callback doen naar ServiceThread.ProcessRequests
3) of toch weer alles als service implementeren, MAAR dan MOET je wel de ServiceExecute houden met een strakke loop
Delphi Code:
while not Terminated do
begin
ServiceThread.ProcessRequests(TRUE); // hier kun je dan TRUE gebruiken
end;
Als je ServiceThread.ProcessRequests(TRUE); gebruikt dan hoef je geen sleep te doen want TRUE wacht op een antwoord (en blokt dus de verdere loop). Dat gebruik je dus alleen als je een thread in de service gebruikt. Anders gebruik je zoals ik hierboven liet zien False met je eigen loop in ServiceExecute.
Bookmarks