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 self.Logger.Active:=false; {$IFDEF WINDOWS} self.Logger.AppendContent:=true; self.Logger.LogType := ltFile; self.Logger.FileName := format('%s/server.log',[extractfilepath(paramstr(0))]); {$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('Запуск сервиса'); workThread.Start; OK := true; end; procedure TLMSReportCGI.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean); begin debugln('Останов сервиса'); workThread.Terminate; end; { TDaemonThread } procedure TDaemonThread.Execute; begin flogger.debug('TDaemonThread.Execute'); 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; flogger.debug('TDaemonThread.Execute.complete'); 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.