ITask = interface procedure AddParam(const aName, aValue: string); procedure AttachObject(aObject: TObject); function Available: boolean; procedure ClearParams; procedure ContinueWith(aTask: ITask); overload; function ContinueWith(aProc: TProc): ITask; overload; function ContinueWith(aEvent: TTaskEvent): ITask; overload; function GetAttachedTask: ITask; function GetAttachedObject: TObject; function GetEvent: TTaskEvent; function GetProc: TProc; function GetExceptionObject: TObject; function GetExceptionEvent: TExceptionEvent; function GetLock: ILock; function GetName: string; function GetParam(const aName: string): string; function GetTerminateEvent: TNotifyEvent; function GetAttachedObjectBehaviour: TAttachedObjectBehaviour; procedure Run; procedure Stop; procedure SendMessage(aTask: ITask; aMessage: TMessage); overload; procedure SendMessage(aTask: ITask; const aText: string); overload; procedure SetLock(aLock: ILock); procedure SetAttachedObjectBehaviour(aValue: TAttachedObjectBehaviour); procedure ReceiveMessage(aMessage: TMessage); procedure SetPriority(aValue: TThreadPriority); function Terminated: boolean; function Wait(aTime: cardinal): boolean; end;
Like this is really easy to create task based on plain methods, other tasks or closures, let's see an easy example:
unit Unit52; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, BB.Task; type TForm51 = class(TForm) procedure FormCreate(Sender: TObject); private procedure One; procedure Two; procedure Three; { Private declarations } public { Public declarations } end; var Form51: TForm51; implementation {$R *.dfm} procedure TForm51.FormCreate(Sender: TObject); var TaskA, TaskB: ITask; begin TaskB := TTask.Create(Three); TaskA := TTask.Create(One); TaskA.ContinueWith(Two).ContinueWith( procedure begin Beep; end ).ContinueWith(TaskB); TaskA.Run; end; procedure TForm51.One; begin Sleep(1000); end; procedure TForm51.Three; begin Sleep(3000); end; procedure TForm51.Two; begin Sleep(2000); end; end.
We are creating task A that will execute method one, after that, method ONE will execute method TWO and after that this task will launch the closure, at the end the closure will call the Task B that is executing method THREE. Is also possible to send messages and objects among different task.
Quite handy.
No comments:
Post a Comment