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.