LMS-2_ReportAPI/cgi_daemon.pas
2023-10-19 13:08:34 +03:00

131 lines
2.6 KiB
ObjectPascal

unit cgi_daemon;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DaemonApp, ConnectionsDmUnit,eventlog;
type
TLMSReportCGI=class;
{ TDaemonThread }
TDaemonThread=class(TThread)
fOwner: TLMSReportCGI;
fData: TConnectionsDM;
fLogger: TEventLog;
procedure Execute;override;
function sleepMin(n: integer): boolean;
constructor Create(AOwner: TLMSReportCGI);
end;
{ TLMSReportCGI }
TLMSReportCGI = class(TDaemon)
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
procedure DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
procedure DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
private
workThread: TDaemonThread;
public
end;
var
LMSReportCGI: TLMSReportCGI;
implementation
uses
LazLogger;
procedure RegisterDaemon;
begin
RegisterDaemonClass(TLMSReportCGI)
end;
{$R *.lfm}
{ TLMSReportCGI }
procedure TLMSReportCGI.DataModuleCreate(Sender: TObject);
begin
//{$IFDEF WINDOWS}
self.Logger.Active:=false;
self.Logger.AppendContent:=true;
self.Logger.LogType := ltFile;
self.Logger.FileName := format('%s/server.log',[extractfilepath(paramstr(0))]);
self.Logger.Active:=true;
//{$ENDIF}
self.logger.Info('TLMSReportCGI.DataModuleCreate');
workThread := TDaemonThread.create(self);
end;
procedure TLMSReportCGI.DataModuleDestroy(Sender: TObject);
begin
workthread.free;
end;
procedure TLMSReportCGI.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
begin
logger.Info('start daemon thread');
workThread.Start;
logger.Info('daemon thread started');
OK := true;
end;
procedure TLMSReportCGI.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
begin
debugln('stop daemon thread');
workThread.Terminate;
end;
{ TDaemonThread }
procedure TDaemonThread.Execute;
begin
flogger.Info('TDaemonThread.Execute');
fData := TConnectionsDM.CreateWithLog(fLogger);
try
fData.logger := fLogger;
fData.log(self,'logging');
flogger.Info('TDaemonThread.Execute.1');
fData.Start;
flogger.Info('TDaemonThread.Execute.2');
while not terminated do
begin
if sleepMin(2) then
fData.Idle(self);
flogger.Info('TDaemonThread.Idle');
end;
fData.Stop;
finally
fData.free;
end;
end;
function TDaemonThread.sleepMin(n: integer): boolean;
var
i: integer;
begin
for i := 1 to n*60 do
begin
if terminated then break
else sleep(1000);
end;
result := not terminated;
end;
constructor TDaemonThread.Create(AOwner: TLMSReportCGI);
begin
inherited Create(true);
fOwner:=AOwner;
fLogger:=AOwner.Logger;
end;
initialization
RegisterDaemon;
end.