RunBackgroundTasks.lpr 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 Failed(task : ITask; aException : Exception);
  25. procedure Finished(task : ITask);
  26. end;
  27. var
  28. backgroundtasks : TBackgroundTasks;
  29. mytask : TMyTask;
  30. i : Integer;
  31. { TMyTask }
  32. procedure TMyTask.DoJob(task : ITask);
  33. var
  34. a, b, i : Integer;
  35. begin
  36. cout('[%s] task "%s" doing a %s job...',[DateTimeToStr(Now()),fName,task.Param[0].AsString],etInfo);
  37. Sleep(Random(1000));
  38. a := Random(100);
  39. b := Random(5) + 1;
  40. i := a div b;
  41. cout('task "%s" result %d / %d = %d',[fName,a,b,i],etSuccess);
  42. end;
  43. procedure TMyTask.Failed(task : ITask; aException : Exception);
  44. begin
  45. cout('task "%s" failed (%s)',[fName,aException.Message],etError);
  46. end;
  47. procedure TMyTask.Finished(task : ITask);
  48. begin
  49. cout('task "%s" finished',[fName],etDebug);
  50. end;
  51. begin
  52. Console.LogVerbose := LOG_DEBUG;
  53. try
  54. backgroundtasks := TBackgroundTasks.Create(10);
  55. for i := 1 to 100 do
  56. begin
  57. mytask := TMyTask.Create;
  58. mytask.Id := i;
  59. mytask.Name := 'Task' + i.ToString;
  60. backgroundtasks.AddTask(['blue'],True,mytask.DoJob
  61. ).OnException(mytask.Failed
  62. ).OnTerminated(mytask.Finished
  63. ).Run;
  64. end;
  65. backgroundtasks.Start;
  66. cout('Running tasks in background!',etInfo);
  67. ConsoleWaitForEnterKey;
  68. backgroundtasks.Free;
  69. except
  70. on E: Exception do
  71. Writeln(E.ClassName, ': ', E.Message);
  72. end;
  73. end.