12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- program RunBackgroundtask;
- {$APPTYPE CONSOLE}
- {$R *.res}
- uses
- SysUtils,
- Quick.Commons,
- Quick.Console,
- Quick.Threads;
- type
- TMyJob = class
- private
- fId : Integer;
- fName : string;
- public
- property Id : Integer read fId write fId;
- property Name : string read fName write fName;
- function DoJob : Integer;
- end;
- var
- i : Integer;
- backgroundtasks : TBackgroundTasks;
- myjob : TMyJob;
- { TMyJob }
- function TMyJob.DoJob : Integer;
- var
- a, b : Integer;
- begin
- cout('task %d doing job...',[fId],etInfo);
- Sleep(Random(1000));
- a := Random(100);
- b := Random(5) + 1;
- Result := a div b;
- cout('task %d result %d / %d = %d',[fId,a,b,Result],etSuccess);
- end;
- begin
- ReportMemoryLeaksOnShutdown := True;
- Console.LogVerbose := LOG_DEBUG;
- try
- { TODO -oUser -cConsole Main : Insert code here }
- backgroundtasks := TBackgroundTasks.Create(10);
- for i := 1 to 100 do
- begin
- myjob := TMyJob.Create;
- myjob.Id := i;
- myjob.Name := 'Task' + i.ToString;
- backgroundtasks.AddTask(
- procedure(task : ITask)
- begin
- cout('task %d started',[TMyJob(task['Job']).Id],etDebug);
- task.Result := TMyJob(task['Job']).DoJob;
- end
- ).SetParameter('Job',myjob,True
- ).WaitAndRetry(10,100
- ).OnRetry(
- procedure(task : ITask; aException : Exception; var vStopRetries : Boolean)
- begin
- if not aException.Message.Contains('Division by zero') then vStopRetries := True
- else cout('task "%s" retried %d/%d (%s)',[TMyJob(task['Job']).Name,task.NumRetries,task.MaxRetries,aException.Message],etWarning);
- end
- ).OnException(
- procedure(task : ITask; aException : Exception)
- begin
- cout('task %d failed (%s)',[TMyJob(task['Job']).Id,aException.Message],etError);
- end
- ).OnTerminated(
- procedure(task : ITask)
- begin
- cout('task %d finished result = %d',[TMyJob(task['Job']).Id,task.Result.AsInteger],etDebug);
- end
- ).Run;
- end;
- backgroundtasks.Start;
- cout('Running tasks in background!',etInfo);
- ConsoleWaitForEnterKey;
- coutFmt('Task gueue size = %d',[backgroundtasks.TaskQueued],etInfo);
- backgroundtasks.Free;
- cout('finished tasks!!!!',etInfo);
- except
- on E: Exception do
- Writeln(E.ClassName, ': ', E.Message);
- end;
- end.
|