main.pas 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. unit main;
  2. interface
  3. uses
  4. System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  5. FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  6. FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
  7. DateUtils,
  8. Quick.Commons,
  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. TfrmMain = class(TForm)
  22. meLog: TMemo;
  23. procedure FormCreate(Sender: TObject);
  24. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  25. procedure FormActivate(Sender: TObject);
  26. private
  27. { Private declarations }
  28. ScheduledTasks : TScheduledTasks;
  29. public
  30. { Public declarations }
  31. end;
  32. var
  33. frmMain: TfrmMain;
  34. ScheduledDate : TDateTime;
  35. ExpirationDate : TDateTime;
  36. implementation
  37. {$R *.fmx}
  38. procedure Log(const msg : string; params : array of const);
  39. begin
  40. frmMain.meLog.Lines.Add(Format(msg,params));
  41. end;
  42. destructor TMyJob.Destroy;
  43. begin
  44. inherited;
  45. end;
  46. procedure TMyJob.DoJob;
  47. var
  48. a, b, i : Integer;
  49. begin
  50. log('[%s] task "%s" doing job...',[DateTimeToStr(Now()),fName]);
  51. //Sleep(Random(1000));
  52. a := Random(100);
  53. b := Random(5) + 1;
  54. i := a div b;
  55. log('task "%s" result %d / %d = %d',[fName,a,b,i]);
  56. end;
  57. procedure TfrmMain.FormActivate(Sender: TObject);
  58. begin
  59. if not ScheduledTasks.IsStarted then ScheduledTasks.Start;
  60. end;
  61. procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
  62. begin
  63. ScheduledTasks.Free;
  64. end;
  65. procedure TfrmMain.FormCreate(Sender: TObject);
  66. var
  67. myjob : TMyJob;
  68. begin
  69. ScheduledTasks := TScheduledTasks.Create;
  70. myjob := TMyJob.Create;
  71. myjob.Id := 1;
  72. myjob.Name := 'Run now and repeat every 1 second for 5 times';
  73. scheduledtasks.AddTask('Task1',[myjob,1],True,
  74. procedure(task : ITask)
  75. begin
  76. Log('task "%s" started',[TMyJob(task.Param[0]).Name]);
  77. TMyJob(task.Param[0]).DoJob;
  78. end
  79. ).OnException(
  80. procedure(task : ITask; aException : Exception)
  81. begin
  82. Log('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message]);
  83. end
  84. ).OnTerminated(
  85. procedure(task : ITask)
  86. begin
  87. Log('task "%s" finished',[TMyJob(task.Param[0]).Name]);
  88. end
  89. ).OnExpired(
  90. procedure(task : ITask)
  91. begin
  92. Log('task "%s" expired',[TMyJob(task.Param[0]).Name]);
  93. end
  94. ).RepeatEvery(1,TTimeMeasure.tmSeconds,5);
  95. myjob := TMyJob.Create;
  96. myjob.Id := 2;
  97. myjob.Name := 'Run now, repeat every 1 second forever';
  98. scheduledtasks.AddTask('Task2',[myjob,32,true,3.2,myjob.ClassType],True,
  99. procedure(task : ITask)
  100. begin
  101. Log('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]);
  102. TMyJob(task.Param[0]).DoJob;
  103. end
  104. ).OnException(
  105. procedure(task : ITask; aException : Exception)
  106. begin
  107. Log('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message]);
  108. end
  109. ).OnTerminated(
  110. procedure(task : ITask)
  111. begin
  112. Log('task "%s" finished',[TMyJob(task.Param[0]).Name]);
  113. end
  114. ).OnExpired(
  115. procedure(task : ITask)
  116. begin
  117. Log('task "%s" expired',[TMyJob(task.Param[0]).Name]);
  118. end
  119. ).StartAt(Now()
  120. ).RepeatEvery(1,TTimeMeasure.tmSeconds);
  121. ScheduledDate := IncSecond(Now(),5);
  122. ExpirationDate := IncSecond(ScheduledDate,10);
  123. myjob := TMyJob.Create;
  124. myjob.Id := 3;
  125. myjob.Name := Format('Run at %s and repeat every 1 second until %s',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
  126. scheduledtasks.AddTask('Task3',[myjob],True,
  127. procedure(task : ITask)
  128. begin
  129. Log('task "%s" started',[TMyJob(task.Param[0]).Name]);
  130. TMyJob(task.Param[0]).DoJob;
  131. end
  132. ).OnException(
  133. procedure(task : ITask; aException : Exception)
  134. begin
  135. Log('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message]);
  136. end
  137. ).OnTerminated(
  138. procedure(task : ITask)
  139. begin
  140. Log('task "%s" finished',[TMyJob(task.Param[0]).Name]);
  141. end
  142. ).OnExpired(
  143. procedure(task : ITask)
  144. begin
  145. Log('task "%s" expired',[TMyJob(task.Param[0]).Name]);
  146. end
  147. ).StartAt(ScheduledDate
  148. ).RepeatEvery(1,TTimeMeasure.tmSeconds,ExpirationDate);
  149. Log('Running tasks in background!',[]);
  150. end;
  151. end.