Verwenden von TTask.IFuture aus der Parallel Programming Library
Nach oben zu Verwenden der Parallel Programming Library
IFuture implementiert TTask zum Aufrufen einer Funktion, die einen bestimmten Typ zurückgibt. Instanzen von IFuture werden von TTask.Future<T> zurückgegeben, wobei der Typparameter, T, den Rückgabetyp repräsentiert. Mit einer Instanz von IFuture können Sie etwas berechnen oder eine Abfrage ausführen, und gleichzeitig können Sie andere Aufgaben durchführen und den Wert bei Bedarf mit IFuture.Value abrufen. Wenn zu diesem Zeitpunkt die Berechnung des Werts noch nicht abgeschlossen ist, wird die aktuelle Ausführung blockiert und gewartet, bis der Wert berechnet wurde. Damit haben Sie die Möglichkeit, Codeblöcken Prioritäten zuzuweisen, um die gewünschte Ausführungsreihenfolge festzulegen, aber dennoch sicherzustellen, dass Sie den Wert bei Bedarf abrufen können.
Delphi:
Deklarieren Sie zuerst Ihre Instanz von IFuture<T>. In diesem Codefragment wird es zum Speichern eines Strings verwendet.
public
{ Public declarations }
FutureString: IFuture<string>;
Die Implementierung, die als anonyme Methode an TTask.Future<T> übergeben wird:
FutureString:= TTask.Future<string>(
function:string
begin
{Some calculation that takes time}
Sleep(3000);
Result:='Hello ' + Random(42).ToString;
end);
Den berechneten Wert können Sie mit IFuture.Value abrufen:
MyString := FutureString.Value;
Deklarieren Sie zuerst Ihre Instanz von IFuture<T>. In diesem Codefragment wird es zum Speichern eines Strings verwendet. Sie müssen außerdem die Methode deklarieren, die die Implementierung der Behandlungsmethode TTask.Future<T> aufnimmt.
public: // User declarations
System::DelphiInterface<IFuture__1<System::String> > FutureString;
System::String __fastcall FutureHandler(TObject* Sender);
Die Implementierung der Behandlungsmethode TTask.Future<T> und der Aufruf dieser Methode:
System::String __fastcall TForm1::FutureHandler(TObject* Sender){
// Some calculation that takes time
Sleep(3000);
return System::String str = System::String().sprintf(L"Hello %d", Random(42));
}
FutureString = TTask::Future<System::String>(0, this->FutureHandler);
Den berechneten Wert können Sie mit IFuture.Value abrufen:
MyString = FutureString->Value;