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
+11 -85
View File
@@ -172,29 +172,6 @@ type
function ParseFileName(const FileName: string): TAuraDataFile; override;
end;
// Implements a data stream that reads from Aura-specific historical data files.
TAuraFileLoader<T: record> = class(TInterfacedObject)
type
TDataProc = reference to procedure(const Values: TArray<TDataPoint<T>>);
private
class procedure LoadFile(
DataServer: TAuraDataServer<T>;
currFile: TAuraDataFile;
Terminated: TState;
Done: TLatch;
Proc: TDataProc
);
public
class function LoadData(
DataServer: TAuraDataServer<T>;
const Symbol: String;
const Terminate: TSignal;
const Proc: TDataProc
): TState;
end;
implementation
uses
@@ -413,12 +390,9 @@ begin
var capProc := Proc;
var terminated := TFlag.CreateObserver(Terminate).State;
var firstFile := FindFirstFile(Symbol);
var done := TLatch.CreateLatch(1);
Result := done.State;
TaskManager.CreateTask(firstFile.Done, procedure begin LoadFile(firstFile.Value, terminated, capProc).Subscribe(done); end);
Result :=
FindFirstFile(Symbol)
.Chain(function(const FirstFile: TAuraDataFile): TState begin Result := LoadFile(FirstFile, terminated, capProc); end);
end;
function TAuraDataServer<T>.LoadDataFile(const DataFile: TAuraDataFile): TFuture<TArray<TDataPoint<T>>>;
@@ -431,19 +405,16 @@ begin
if not currFile.IsValid or Terminated.IsSet then
exit(TState.Null);
var done := TLatch.CreateLatch(1);
Result := done.State;
var data := FCachedFiles.GetOrAdd(currFile.GetFullFileName);
TaskManager.CreateTask(
data.Done,
procedure
begin
Proc(data.Value, Terminated);
LoadFile(currFile.GetNextFile, Terminated, Proc).Subscribe(done);
end
);
Result :=
data.Chain(
function(const Data: TArray<TDataPoint<T>>): TState
begin
Proc(Data, Terminated);
Result := LoadFile(currFile.GetNextFile, Terminated, Proc);
end
);
end;
{ TAuraFileStream<T> }
@@ -792,49 +763,4 @@ begin
end;
end;
class function TAuraFileLoader<T>.LoadData(
DataServer: TAuraDataServer<T>;
const Symbol: String;
const Terminate: TSignal;
const Proc: TDataProc
): TState;
begin
var capProc := Proc;
var terminated := TFlag.CreateObserver(Terminate).State;
var firstFile := DataServer.FindFirstFile(Symbol);
var done := TLatch.CreateLatch(1);
TaskManager.CreateTask(firstFile.Done, procedure begin LoadFile(DataServer, firstFile.Value, terminated, done, capProc); end);
Result := done.State;
end;
class procedure TAuraFileLoader<T>.LoadFile(
DataServer: TAuraDataServer<T>;
currFile: TAuraDataFile;
Terminated: TState;
Done: TLatch;
Proc: TDataProc
);
begin
if not currFile.IsValid or Terminated.IsSet then
begin
Done.Notify;
exit;
end;
var data := DataServer.LoadDataFile(currFile);
TaskManager.CreateTask(
data.Done,
procedure
begin
Proc(data.Value);
LoadFile(DataServer, currFile.GetNextFile, Terminated, Done, Proc);
end
);
end;
end.