daemon.pp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. program daemon;
  2. {$mode objfpc}{$H+}
  3. {$define usecthreads}
  4. {$apptype gui}
  5. uses
  6. {$IFDEF UNIX}{$IFDEF UseCThreads}
  7. cthreads,
  8. {$ENDIF}{$ENDIF}
  9. sysutils,
  10. Classes
  11. { add your units here }, daemonapp;
  12. Type
  13. { TTestDaemon }
  14. { TTestThread }
  15. TTestThread = Class(TThread)
  16. Procedure Execute; override;
  17. end;
  18. TTestDaemon = Class(TCustomDaemon)
  19. Private
  20. FThread : TTestThread;
  21. Procedure ThreadStopped (Sender : TObject);
  22. public
  23. Function Start : Boolean; override;
  24. Function Stop : Boolean; override;
  25. Function Pause : Boolean; override;
  26. Function Continue : Boolean; override;
  27. Function Execute : Boolean; override;
  28. Function ShutDown : Boolean; override;
  29. Function Install : Boolean; override;
  30. Function UnInstall: boolean; override;
  31. end;
  32. { TTestThread }
  33. procedure TTestThread.Execute;
  34. Var
  35. C : Integer;
  36. begin
  37. C:=0;
  38. Repeat
  39. Sleep(1000);
  40. inc(c);
  41. Application.Logger.Info(Format('Tick : %d',[C]));
  42. Until Terminated;
  43. end;
  44. Procedure AWriteln(MSg : String; B : Boolean);
  45. begin
  46. Application.Logger.Info(Msg+BoolToStr(B));
  47. end;
  48. { TTestDaemon }
  49. procedure TTestDaemon.ThreadStopped(Sender: TObject);
  50. begin
  51. FreeAndNil(FThread);
  52. end;
  53. function TTestDaemon.Start: Boolean;
  54. begin
  55. Result:=inherited Start;
  56. AWriteln('Daemon Start',Result);
  57. FThread:=TTestThread.Create(True);
  58. FThread.OnTerminate:=@ThreadStopped;
  59. FThread.FreeOnTerminate:=False;
  60. FThread.Resume;
  61. end;
  62. function TTestDaemon.Stop: Boolean;
  63. begin
  64. Result:=inherited Stop;
  65. AWriteln('Daemon Stop: ',Result);
  66. FThread.Terminate;
  67. end;
  68. function TTestDaemon.Pause: Boolean;
  69. begin
  70. Result:=inherited Pause;
  71. AWriteln('Daemon pause: ',Result);
  72. FThread.Suspend;
  73. end;
  74. function TTestDaemon.Continue: Boolean;
  75. begin
  76. Result:=inherited Continue;
  77. AWriteln('Daemon continue: ',Result);
  78. FThread.Resume;
  79. end;
  80. function TTestDaemon.Execute: Boolean;
  81. begin
  82. Result:=inherited Execute;
  83. AWriteln('Daemon execute: ',Result);
  84. end;
  85. function TTestDaemon.ShutDown: Boolean;
  86. begin
  87. Result:=inherited ShutDown;
  88. AWriteln('Daemon Shutdown: ',Result);
  89. FThread.Terminate;
  90. end;
  91. function TTestDaemon.Install: Boolean;
  92. begin
  93. Result:=inherited Install;
  94. AWriteln('Daemon Install: ',Result);
  95. end;
  96. function TTestDaemon.UnInstall: boolean;
  97. begin
  98. Result:=inherited UnInstall;
  99. AWriteln('Daemon UnInstall: ',Result);
  100. end;
  101. Type
  102. { TTestDaemonMapper }
  103. TTestDaemonMapper = Class(TCustomDaemonMapper)
  104. Constructor Create(AOwner : TComponent); override;
  105. end;
  106. { TTestDaemonMapper }
  107. constructor TTestDaemonMapper.Create(AOwner: TComponent);
  108. Var
  109. D : TDaemonDef;
  110. begin
  111. inherited Create(AOwner);
  112. D:=DaemonDefs.Add as TDaemonDef;
  113. D.DisplayName:='Test daemon';
  114. D.Name:='TestDaemon';
  115. D.DaemonClassName:='TTestDaemon';
  116. D.WinBindings.ServiceType:=stWin32;
  117. end;
  118. begin
  119. RegisterDaemonClass(TTestDaemon);
  120. RegisterDaemonMapper(TTestDaemonMapper);
  121. Application.Title:='Daemon test application';
  122. Application.Run;
  123. end.