LMS-2_ReportAPI/cgi_daemon.pas
2023-11-17 12:46:39 +03:00

127 lines
2.5 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, extTypes;
procedure RegisterDaemon;
begin
RegisterDaemonClass(TLMSReportCGI)
end;
{$R *.lfm}
{ TLMSReportCGI }
procedure TLMSReportCGI.DataModuleCreate(Sender: TObject);
begin
self.Logger.Active:=false;
{$IFDEF WINDOWS}
self.Logger.AppendContent:=true;
self.Logger.LogType := ltFile;
self.Logger.FileName := format('%s/server.log',[extractfilepath(paramstr(0))]);
{$ELSE}
self.Logger.LogType := ltSystem;
{$ENDIF}
self.logger.Identification:='LMS-Report-Service';
self.Logger.Active:=true;
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('Запуск сервиса '+version);
workThread.Start;
OK := true;
end;
procedure TLMSReportCGI.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
begin
logger.Info('Останов сервиса '+version);
workThread.Terminate;
workThread.WaitFor;
end;
{ TDaemonThread }
procedure TDaemonThread.Execute;
begin
fData := TConnectionsDM.CreateWithLog(fLogger);
try
fData.Start;
while not terminated do
begin
if sleepMin(5) then
fData.Idle(self);
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.