123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- unit main;
- interface
- uses
- System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
- FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
- FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
- DateUtils,
- Quick.Commons,
- Quick.Threads, FMX.StdCtrls, FMX.Layouts;
- type
- TMyJob = class
- private
- fId : Integer;
- fName : string;
- public
- destructor Destroy; override;
- property Id : Integer read fId write fId;
- property Name : string read fName write fName;
- procedure DoJob;
- end;
- TfrmMain = class(TForm)
- meLog: TMemo;
- Layout1: TLayout;
- btnStart: TButton;
- procedure FormCreate(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure FormActivate(Sender: TObject);
- procedure btnStartClick(Sender: TObject);
- private
- { Private declarations }
- ScheduledTasks : TScheduledTasks;
- public
- { Public declarations }
- end;
- var
- frmMain: TfrmMain;
- ScheduledDate : TDateTime;
- ExpirationDate : TDateTime;
- implementation
- {$R *.fmx}
- procedure Log(const msg : string; params : array of const);
- begin
- frmMain.meLog.Lines.Add(Format(msg,params));
- end;
- destructor TMyJob.Destroy;
- begin
- inherited;
- end;
- procedure TMyJob.DoJob;
- var
- a, b, i : Integer;
- begin
- log('[%s] task "%s" doing job...',[DateTimeToStr(Now()),fName]);
- //Sleep(Random(1000));
- a := Random(100);
- b := Random(5) + 1;
- i := a div b;
- log('task "%s" result %d / %d = %d',[fName,a,b,i]);
- end;
- procedure TfrmMain.btnStartClick(Sender: TObject);
- begin
- ScheduledTasks.Start;
- end;
- procedure TfrmMain.FormActivate(Sender: TObject);
- begin
- //if not ScheduledTasks.IsStarted then ScheduledTasks.Start;
- end;
- procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- ScheduledTasks.Free;
- end;
- procedure TfrmMain.FormCreate(Sender: TObject);
- var
- myjob : TMyJob;
- begin
- ScheduledTasks := TScheduledTasks.Create;
- myjob := TMyJob.Create;
- myjob.Id := 1;
- myjob.Name := 'Run now and repeat every 1 second for 5 times';
- scheduledtasks.AddTask_Sync('Task1',[myjob,1],True,
- procedure(task : ITask)
- begin
- Log('task "%s" started',[TMyJob(task.Param[0]).Name]);
- TMyJob(task.Param[0]).DoJob;
- end
- ).OnException(
- procedure(task : ITask; aException : Exception)
- begin
- Log('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message]);
- end
- ).OnTerminated_Sync(
- procedure(task : ITask)
- begin
- Log('task "%s" finished',[TMyJob(task.Param[0]).Name]);
- end
- ).OnExpired_Sync(
- procedure(task : ITask)
- begin
- Log('task "%s" expired',[TMyJob(task.Param[0]).Name]);
- end
- ).RepeatEvery(1,TTimeMeasure.tmSeconds,5);
- myjob := TMyJob.Create;
- myjob.Id := 2;
- myjob.Name := 'Run now, repeat every 1 second forever';
- scheduledtasks.AddTask_Sync('Task2',[myjob,32,true,3.2,myjob.ClassType],True,
- procedure(task : ITask)
- begin
- 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]);
- TMyJob(task.Param[0]).DoJob;
- end
- ).OnException(
- procedure(task : ITask; aException : Exception)
- begin
- Log('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message]);
- end
- ).OnTerminated_Sync(
- procedure(task : ITask)
- begin
- Log('task "%s" finished',[TMyJob(task.Param[0]).Name]);
- end
- ).OnExpired_Sync(
- procedure(task : ITask)
- begin
- Log('task "%s" expired',[TMyJob(task.Param[0]).Name]);
- end
- ).StartAt(Now()
- ).RepeatEvery(1,TTimeMeasure.tmSeconds);
- ScheduledDate := IncSecond(Now(),5);
- ExpirationDate := IncSecond(ScheduledDate,10);
- myjob := TMyJob.Create;
- myjob.Id := 3;
- myjob.Name := Format('Run at %s and repeat every 1 second until %s',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
- scheduledtasks.AddTask_Sync('Task3',[myjob],True,
- procedure(task : ITask)
- begin
- Log('task "%s" started',[TMyJob(task.Param[0]).Name]);
- TMyJob(task.Param[0]).DoJob;
- end
- ).OnException(
- procedure(task : ITask; aException : Exception)
- begin
- Log('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message]);
- end
- ).OnTerminated_Sync(
- procedure(task : ITask)
- begin
- Log('task "%s" finished',[TMyJob(task.Param[0]).Name]);
- end
- ).OnExpired_Sync(
- procedure(task : ITask)
- begin
- Log('task "%s" expired',[TMyJob(task.Param[0]).Name]);
- end
- ).StartAt(ScheduledDate
- ).RepeatEvery(1,TTimeMeasure.tmSeconds,ExpirationDate);
- Log('Running tasks in background!',[]);
- end;
- end.
|