RunBackgroundTasks.lpr 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. program RunBackgroundTasks;
  2. {$IFDEF MSWINDOWS}
  3. {$APPTYPE CONSOLE}
  4. {$ENDIF}
  5. {$MODE DELPHI}
  6. uses
  7. {$IFDEF UNIX}
  8. cthreads,
  9. {$ENDIF}
  10. SysUtils,
  11. DateUtils,
  12. Quick.Commons,
  13. Quick.Console,
  14. Quick.Threads;
  15. type
  16. TMyTask = class
  17. private
  18. fId : Integer;
  19. fName : string;
  20. public
  21. property Id : Integer read fId write fId;
  22. property Name : string read fName write fName;
  23. procedure DoJob(task : ITask);
  24. procedure Retry(task : ITask; aException : Exception; var vStopRetries : Boolean);
  25. procedure Failed(task : ITask; aException : Exception);
  26. procedure Finished(task : ITask);
  27. end;
  28. var
  29. backgroundtasks : TBackgroundTasks;
  30. mytask : TMyTask;
  31. i : Integer;
  32. { TMyTask }
  33. procedure TMyTask.DoJob(task : ITask);
  34. var
  35. a, b, i : Integer;
  36. begin
  37. cout('[%s] task "%s" doing a %s job...',[DateTimeToStr(Now()),fName,task.Param[0].AsString],etInfo);
  38. Sleep(Random(1000));
  39. a := Random(100);
  40. b := Random(5) + 1;
  41. i := a div b;
  42. cout('task "%s" result %d / %d = %d',[fName,a,b,i],etSuccess);
  43. end;
  44. procedure TMyTask.Retry(task : ITask; aException : Exception; var vStopRetries : Boolean);
  45. begin
  46. cout('task "%s" retrying (%s)',[fName,aException.Message],etWarning);
  47. end;
  48. procedure TMyTask.Failed(task : ITask; aException : Exception);
  49. begin
  50. cout('task "%s" failed (%s)',[fName,aException.Message],etError);
  51. end;
  52. procedure TMyTask.Finished(task : ITask);
  53. begin
  54. cout('task "%s" finished',[fName],etDebug);
  55. end;
  56. begin
  57. Console.LogVerbose := LOG_DEBUG;
  58. try
  59. backgroundtasks := TBackgroundTasks.Create(10);
  60. for i := 1 to 100 do
  61. begin
  62. mytask := TMyTask.Create;
  63. mytask.Id := i;
  64. mytask.Name := 'Task' + i.ToString;
  65. backgroundtasks.AddTask(['blue'],True,mytask.DoJob
  66. ).WaitAndRetry(10,100
  67. ).OnRetry(mytask.Retry
  68. ).OnException(mytask.Failed
  69. ).OnTerminated(mytask.Finished
  70. ).Run;
  71. end;
  72. backgroundtasks.Start;
  73. cout('Running tasks in background!',etInfo);
  74. ConsoleWaitForEnterKey;
  75. backgroundtasks.Free;
  76. except
  77. on E: Exception do
  78. Writeln(E.ClassName, ': ', E.Message);
  79. end;
  80. end.