TaskManager.RunTask() & TFuture.Chain(Proc)
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user