RunScheduledTasks.lpr 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. program RunScheduledTasks;
  2. {$APPTYPE CONSOLE}
  3. {$MODE DELPHI}
  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. property Id : Integer read fId write fId;
  17. property Name : string read fName write fName;
  18. procedure DoJob(task : ITask);
  19. procedure Failed(task : ITask; aException : Exception);
  20. procedure Finished(task : ITask);
  21. procedure Expired(task : ITask);
  22. end;
  23. var
  24. scheduledtasks : TScheduledTasks;
  25. myjob : TMyJob;
  26. ScheduledDate : TDateTime;
  27. ExpirationDate : TDateTime;
  28. { TMyJob }
  29. procedure TMyJob.DoJob(task : ITask);
  30. var
  31. a, b, i : Integer;
  32. begin
  33. cout('[%s] task "%s" doing a %s job %d...',[DateTimeToStr(Now()),fName,task.Param[0].AsString,task.Param[1].AsInteger],etInfo);
  34. Sleep(Random(1000));
  35. a := Random(100);
  36. b := Random(5) + 1;
  37. i := a div b;
  38. cout('task "%s" result %d / %d = %d',[fName,a,b,i],etSuccess);
  39. end;
  40. procedure TMyJob.Failed(task : ITask; aException : Exception);
  41. begin
  42. cout('task "%s" failed (%s)',[fName,aException.Message],etError);
  43. end;
  44. procedure TMyJob.Finished(task : ITask);
  45. begin
  46. cout('task "%s" finished',[fName],etDebug);
  47. end;
  48. procedure TMyJob.Expired(task : ITask);
  49. begin
  50. cout('task "%s" expired',[fName],etWarning);
  51. end;
  52. begin
  53. Console.LogVerbose := LOG_DEBUG;
  54. try
  55. scheduledtasks := TScheduledTasks.Create;
  56. scheduledtasks.RemoveTaskAfterExpiration := True;
  57. myjob := TMyJob.Create;
  58. myjob.Id := 1;
  59. myjob.Name := 'Run now and repeat every 1 minute for 5 times';
  60. scheduledtasks.AddTask('Taks1',['blue',7],True,myjob.DoJob
  61. ).OnException(myjob.Failed
  62. ).OnTerminated(myjob.Finished
  63. ).OnExpired(myjob.Expired
  64. ).RepeatEvery(1,TTimeMeasure.tmSeconds,5);
  65. myjob := TMyJob.Create;
  66. myjob.Id := 2;
  67. myjob.Name := 'Run now and repeat every 1 second forever';
  68. scheduledtasks.AddTask('Task2',['red',14],True,myjob.DoJob
  69. ).OnException(myjob.Failed
  70. ).OnTerminated(myjob.Finished
  71. ).OnExpired(myjob.Expired
  72. ).StartAt(Now()
  73. ).RepeatEvery(1,TTimeMeasure.tmseconds);
  74. ScheduledDate := IncSecond(Now(),5);
  75. ExpirationDate := IncSecond(ScheduledDate,10);
  76. myjob := TMyJob.Create;
  77. myjob.Id := 3;
  78. myjob.Name := Format('Run at %s and repeat every 1 second until %s',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
  79. scheduledtasks.AddTask('Task3',['white',21],True,myjob.DoJob
  80. ).OnException(myjob.Failed
  81. ).OnTerminated(myjob.Finished
  82. ).OnExpired(myjob.Expired
  83. ).StartAt(ScheduledDate
  84. ).RepeatEvery(1,TTimeMeasure.tmSeconds,ExpirationDate);
  85. scheduledtasks.Start;
  86. cout('Running tasks in background!',etInfo);
  87. ConsoleWaitForEnterKey;
  88. scheduledtasks.Free;
  89. except
  90. on E: Exception do
  91. Writeln(E.ClassName, ': ', E.Message);
  92. end;
  93. end.