2
0

main.pas 6.2 KB

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