08/03/20 12:29:04
type
TTask = class(TAction)
property OnBeforeExecute;
property OnAfterExecute;
...その他いろいろ..
end;
TTaskList = class
Items: TObjectList;
procedure Add(Task: TAction; RemoveOldTask: Boolean = False; DelayMSec: Integer = 0; RepeatCount: Integer = 1);
function Exist(Task: TTask): Boolean;
procedure Remove(Task: TTask);
procedure Execute;
end;
procedure TForm1.Button1Click;
begin
TaskList.Add(ActionLoadData);
TaskList.Add(ActionProcessData);
TaskList.Add(ActionPrintData);
end;
procedure TForm1.ApplicationIdle;
begin
TaskList.Execute; // 登録タスクをひとつ実行
end;
みたいなタスク(アクション)スケジューラを導入したらスパゲッティなイベントの流れがとてもシンプルになった。
今まではイベントハンドラ中からイベントハンドラを呼び出して更にApplication.ProcessMessagesが他のもの呼び出して・・・と依存関係やタイミングに起因するバグの温床になってたのがかなり減りそうな予感。
こういうクラスって既によく練られたものがどこかにあったりする?
Executeイベントハンドラをサブスレッドで実行できるTaskとか作ったらかなり便利になりそうだな。