RunBackgroundtask.dpr 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. program RunBackgroundtask;
  2. {$APPTYPE CONSOLE}
  3. {$R *.res}
  4. uses
  5. SysUtils,
  6. Quick.Commons,
  7. Quick.Console,
  8. Quick.Threads;
  9. type
  10. TMyJob = class
  11. private
  12. fId : Integer;
  13. fName : string;
  14. public
  15. property Id : Integer read fId write fId;
  16. property Name : string read fName write fName;
  17. procedure DoJob;
  18. end;
  19. var
  20. i : Integer;
  21. backgroundtasks : TBackgroundTasks;
  22. myjob : TMyJob;
  23. { TMyJob }
  24. procedure TMyJob.DoJob;
  25. var
  26. a, b, i : Integer;
  27. begin
  28. cout('task %d doing job...',[fId],etInfo);
  29. Sleep(Random(1000));
  30. a := Random(100);
  31. b := Random(5) + 1;
  32. i := a div b;
  33. cout('task %d result %d / %d = %d',[fId,a,b,i],etSuccess);
  34. end;
  35. begin
  36. ReportMemoryLeaksOnShutdown := True;
  37. Console.LogVerbose := LOG_DEBUG;
  38. try
  39. { TODO -oUser -cConsole Main : Insert code here }
  40. backgroundtasks := TBackgroundTasks.Create(10);
  41. for i := 1 to 100 do
  42. begin
  43. myjob := TMyJob.Create;
  44. myjob.Id := i;
  45. myjob.Name := 'Task' + i.ToString;
  46. backgroundtasks.AddTask([myjob],False,
  47. procedure(task : ITask)
  48. begin
  49. cout('task %d started',[TMyJob(task.Param[0]).Id],etDebug);
  50. TMyJob(task.Param[0].AsObject).DoJob;
  51. end
  52. ).OnException(
  53. procedure(task : ITask; aException : Exception)
  54. begin
  55. cout('task %d failed (%s)',[TMyJob(task.Param[0]).Id,aException.Message],etError);
  56. end
  57. ).OnTerminated(
  58. procedure(task : ITask)
  59. begin
  60. cout('task %d finished',[TMyJob(task.Param[0]).Id],etDebug);
  61. TMyJob(task.Param[0]).Free;
  62. end
  63. ).Run;
  64. end;
  65. backgroundtasks.Start;
  66. //backgroundtasks.RunAndFreeOnTerminate;
  67. cout('Running tasks in background!',etInfo);
  68. ConsoleWaitForEnterKey;
  69. backgroundtasks.Free;
  70. except
  71. on E: Exception do
  72. Writeln(E.ClassName, ': ', E.Message);
  73. end;
  74. end.