2
0

RunScheduledtask.dpr 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. program RunScheduledtask;
  2. {$APPTYPE CONSOLE}
  3. {$R *.res}
  4. uses
  5. SysUtils,
  6. DateUtils,
  7. Quick.Commons,
  8. Quick.Console,
  9. Quick.Threads;
  10. type
  11. TMyJob = class
  12. private
  13. fId : Integer;
  14. fName : string;
  15. public
  16. destructor Destroy; override;
  17. property Id : Integer read fId write fId;
  18. property Name : string read fName write fName;
  19. procedure DoJob;
  20. end;
  21. var
  22. scheduledtasks : TScheduledTasks;
  23. myjob : TMyJob;
  24. ScheduledDate : TDateTime;
  25. ExpirationDate : TDateTime;
  26. { TMyTask }
  27. destructor TMyJob.Destroy;
  28. begin
  29. inherited;
  30. end;
  31. procedure TMyJob.DoJob;
  32. var
  33. a, b, i : Integer;
  34. begin
  35. cout('[%s] task "%s" doing job...',[DateTimeToStr(Now()),fName],etInfo);
  36. //Sleep(Random(1000));
  37. a := Random(100);
  38. b := Random(5) + 1;
  39. i := a div b;
  40. cout('task "%s" result %d / %d = %d',[fName,a,b,i],etSuccess);
  41. end;
  42. begin
  43. ReportMemoryLeaksOnShutdown := True;
  44. Console.LogVerbose := LOG_DEBUG;
  45. try
  46. scheduledtasks := TScheduledTasks.Create;
  47. scheduledtasks.RemoveTaskAfterExpiration := True;
  48. myjob := TMyJob.Create;
  49. myjob.Id := 1;
  50. myjob.Name := 'Run now and repeat every 1 second for 5 times';
  51. scheduledtasks.AddTask('Task1',[myjob,1],True,
  52. procedure(task : ITask)
  53. begin
  54. cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
  55. TMyJob(task.Param[0]).DoJob;
  56. end
  57. ).OnException(
  58. procedure(task : ITask; aException : Exception)
  59. begin
  60. cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
  61. end
  62. ).OnTerminated(
  63. procedure(task : ITask)
  64. begin
  65. cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
  66. end
  67. ).OnExpired(
  68. procedure(task : ITask)
  69. begin
  70. cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
  71. end
  72. ).RepeatEvery(1,TTimeMeasure.tmSeconds,5);
  73. myjob := TMyJob.Create;
  74. myjob.Id := 2;
  75. myjob.Name := 'Run now, repeat every 1 second forever';
  76. scheduledtasks.AddTask('Task2',[myjob,32,true,3.2,myjob.ClassType],True,
  77. procedure(task : ITask)
  78. begin
  79. cout('task "%s" started with params(Int=%d / Bool=%s / Float=%s /Class=%s)',[TMyJob(task.Param[0]).Name,task.Param[1].AsInteger,task.Param[2].AsString,task.Param[3].AsString,task.Param[4].AsString],etDebug);
  80. TMyJob(task.Param[0]).DoJob;
  81. end
  82. ).OnException(
  83. procedure(task : ITask; aException : Exception)
  84. begin
  85. cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
  86. end
  87. ).OnTerminated(
  88. procedure(task : ITask)
  89. begin
  90. cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
  91. end
  92. ).OnExpired(
  93. procedure(task : ITask)
  94. begin
  95. cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
  96. end
  97. ).StartAt(Now()
  98. ).RepeatEvery(1,TTimeMeasure.tmSeconds);
  99. ScheduledDate := IncSecond(Now(),5);
  100. ExpirationDate := IncSecond(ScheduledDate,10);
  101. myjob := TMyJob.Create;
  102. myjob.Id := 3;
  103. myjob.Name := Format('Run at %s and repeat every 1 second until %s',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
  104. scheduledtasks.AddTask('Task3',[myjob],True,
  105. procedure(task : ITask)
  106. begin
  107. cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
  108. TMyJob(task.Param[0]).DoJob;
  109. end
  110. ).OnException(
  111. procedure(task : ITask; aException : Exception)
  112. begin
  113. cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
  114. end
  115. ).OnTerminated(
  116. procedure(task : ITask)
  117. begin
  118. cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
  119. end
  120. ).OnExpired(
  121. procedure(task : ITask)
  122. begin
  123. cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
  124. end
  125. ).StartAt(ScheduledDate
  126. ).RepeatEvery(1,TTimeMeasure.tmSeconds,ExpirationDate);
  127. ScheduledDate := IncSecond(Now(),30);
  128. myjob := TMyJob.Create;
  129. myjob.Id := 4;
  130. myjob.Name := Format('Run at %s and repeat only one time',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
  131. scheduledtasks.AddTask('Task4',[myjob],True,
  132. procedure(task : ITask)
  133. begin
  134. cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
  135. TMyJob(task.Param[0]).DoJob;
  136. end
  137. ).OnException(
  138. procedure(task : ITask; aException : Exception)
  139. begin
  140. cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
  141. end
  142. ).OnTerminated(
  143. procedure(task : ITask)
  144. begin
  145. cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
  146. end
  147. ).OnExpired(
  148. procedure(task : ITask)
  149. begin
  150. cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
  151. end
  152. ).StartAt(ScheduledDate
  153. ).RunOnce;
  154. scheduledtasks.Start;
  155. cout('Running tasks in background!',etInfo);
  156. Readln;
  157. cout('Stopping task2...',etWarning);
  158. scheduledtasks.GetTask('Task2').Cancel;
  159. Readln;
  160. scheduledtasks.Free;
  161. except
  162. on E: Exception do
  163. Writeln(E.ClassName, ': ', E.Message);
  164. end;
  165. end.