Tutorial: Verwenden von Futures aus der Parallel Programming Library
Nach oben zu Tutorials zur Parallel Programming Library
Inhaltsverzeichnis
In diesem Tutorial wird die Verwendung von Futures aus der Parallel Programming Library (PPL) gezeigt. Ein Future ist eine TTask mit einem Rückgabewert und kann daher als parallele Funktion angesehen werden.
Dieses Tutorial besteht aus einer einfachen Anwendung mit zwei Schaltflächen. Mit der einen Schaltfläche wird eine Berechnung gestartet und mit der anderen der Wert zurückgegeben. Mit Futures können Sie diesen Wert auf Anforderung abrufen. Falls er noch nicht berechnet wurde, wartet die Ausgabe, bis die Berechnung abgeschlossen ist.
Erstellen des Projekts
Erstellen Sie ein neues Projekt:
- Für Delphi wählen Sie Datei > Neu > Geräteübergreifende Anwendung - Delphi > Leere Anwendung.
- Für C++Builder wählen Sie Datei > Neu > Geräteübergreifende Anwendung - C++Builder > Leere Anwendung.
Hinzufügen der Komponenten
- Fügen Sie dem Formular zwei TButton-Komponenten hinzu.
- Setzen Sie die Eigenschaft Text der ersten Schaltfläche auf Start Future String. Mit dieser Schaltfläche wird ein Future gestartet.
- Setzen Sie die Eigenschaft Text der zweiten Schaltfläche auf Request Future String. Mit dieser Schaltfläche wird das Ergebnis angefordert.
Implementieren der TTask.Future-Funktionalität
Implementieren Sie zuerst die Ereignisbehandlungsroutinen für die OnClick-Ereignisse der Schaltflächen Start Future String und Request Future String. Schreiben Sie dazu Code wie den folgenden:
In Delphi wird die Funktion als anonyme Methode an TTask.Future übergeben.
procedure TForm1.Button1Click(Sender: TObject);
begin
FutureString:= TTask.Future<string>(
function:string
begin
{Some calculation that takes time}
Sleep(3000);
Result:='Hello ' + Random(42).ToString;
end);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button2.Text := FutureString.Value;
end;
void __fastcall TForm1::Button1Click(TObject *Sender){
FutureString = TTask::Future<System::String>(0, this->FutureHandler);
}
System::String __fastcall TForm1::FutureHandler(TObject* Sender){
// Some calculation that takes time
Sleep(3000);
System::String str = System::String().sprintf(L"Hello %d", Random(42));
return str;
}
void __fastcall TForm1::Button2Click(TObject *Sender){
Button2->Text = FutureString->Value;
}
Fügen Sie dann die folgende Deklaration hinzu:
public
{ Public declarations }
FutureString: IFuture<string>;
public: // User declarations
System::DelphiInterface<IFuture__1<System::String> > FutureString;
System::String __fastcall FutureHandler(TObject* Sender);
Schließlich müssen Sie die erforderlichen Bibliotheken in den Code einbeziehen.
Fügen Sie für Delphi-Anwendungen der uses-Klausel die folgende Unit hinzu, sofern sie noch nicht darin enthalten ist:
uses
System.Threading;
Fügen Sie für C++-Anwendungen der Projekt-Header-Datei den folgenden include-Operator hinzu:
#include <System.Threading.hpp>
Ausführen der Anwendung
Nun können Sie die Anwendung ausführen:
- Drücken Sie
F9
, oder wählen Sie Start > Start.
Klicken Sie auf Start Future String, um die Prozedur auszuführen, und klicken Sie dann auf Request Future String, um das Ergebnis abzurufen. Falls der Wert noch nicht berechnet wurde, wird auf den Abschluss der Berechnung gewartet. Ansonsten wird das Ergebnis sofort anzeigt.