TaskManager.RunTask() & TFuture.Chain(Proc)

This commit is contained in:
Michael Schimmel
2025-06-24 20:17:04 +02:00
parent a65a5f2b0a
commit 13c41d01b5
8 changed files with 120 additions and 165 deletions
+52 -13
View File
@@ -7,27 +7,41 @@ uses
Myc.Signals;
type
IMycTaskManager = interface
// TOD Dokumentation
function CreateTask(const Gate: TState; const Proc: TProc): TSignal.TSubscription;
TTaskManager = record
type
IMycTaskManager = interface
procedure RunTask(const Gate: TState; const Proc: TProc);
procedure WaitFor(const State: TState);
end;
private
FTaskManager: IMycTaskManager;
public
constructor Create(const ATaskManager: IMycTaskManager);
class operator Implicit(const A: IMycTaskManager): TTaskManager; overload;
class operator Implicit(const A: TTaskManager): IMycTaskManager; overload;
// Run a task when the gate is opened.
procedure RunTask(const Gate: TState; const Proc: TProc); inline;
// Waits for the operation associated with State to complete.
// Must not be called from a worker thread of this factory.
// After waiting, or if the state is already set, any first stored exception
// from any worker thread of this factory will be re-raised in the calling (main) thread.
// Raises ETaskException if called from within a worker thread.
procedure WaitFor(const State: TState.IState);
procedure WaitFor(const State: TState); inline;
end;
var
TaskManager: IMycTaskManager;
TaskManager: TTaskManager;
procedure SetupTaskManagerMock;
implementation
uses
System.Generics.Collections;
System.Generics.Collections,
Myc.Core.Tasks;
type
TMycExecMock = class(TInterfacedObject, TSignal.ISubscriber)
@@ -38,11 +52,11 @@ type
function Notify: Boolean;
end;
TMycTaskManagerMock = class(TInterfacedObject, IMycTaskManager)
TMycTaskManagerMock = class(TInterfacedObject, TTaskManager.IMycTaskManager)
public
// IMycTaskManager
function CreateTask(const Gate: TState; const Proc: TProc): TSignal.TSubscription;
procedure WaitFor(const State: TState.IState);
procedure RunTask(const Gate: TState; const Proc: TProc);
procedure WaitFor(const State: TState);
constructor Create;
end;
@@ -72,19 +86,44 @@ begin
inherited Create;
end;
function TMycTaskManagerMock.CreateTask(const Gate: TState; const Proc: TProc): TSignal.TSubscription;
procedure TMycTaskManagerMock.RunTask(const Gate: TState; const Proc: TProc);
begin
Result := Gate.Signal.Subscribe(TMycExecMock.Create(Proc));
Gate.Signal.Subscribe(TMycExecMock.Create(Proc));
end;
procedure TMycTaskManagerMock.WaitFor(const State: TState.IState);
procedure TMycTaskManagerMock.WaitFor(const State: TState);
begin
Assert(State.IsSet);
end;
procedure SetupTaskManagerMock;
begin
TaskManager := TMycTaskManagerMock.Create;
TaskManager.Create(TMycTaskManagerMock.Create);
end;
constructor TTaskManager.Create(const ATaskManager: IMycTaskManager);
begin
FTaskManager := ATaskManager;
end;
procedure TTaskManager.RunTask(const Gate: TState; const Proc: TProc);
begin
FTaskManager.RunTask(Gate, Proc);
end;
procedure TTaskManager.WaitFor(const State: TState);
begin
FTaskManager.WaitFor(State);
end;
class operator TTaskManager.Implicit(const A: IMycTaskManager): TTaskManager;
begin
Result.Create(A);
end;
class operator TTaskManager.Implicit(const A: TTaskManager): IMycTaskManager;
begin
Result := A.FTaskManager;
end;
end.