Tutorial: Verwenden von Futures aus der Parallel Programming Library

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Tutorials zur Parallel Programming Library

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

  1. Fügen Sie dem Formular zwei TButton-Komponenten hinzu.
  2. Setzen Sie die Eigenschaft Text der ersten Schaltfläche auf Start Future String. Mit dieser Schaltfläche wird ein Future gestartet.
  3. 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:

Delphi:

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;
C++:
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>;
C++:
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.

Delphi:

Fügen Sie für Delphi-Anwendungen der uses-Klausel die folgende Unit hinzu, sofern sie noch nicht darin enthalten ist:

uses
  System.Threading;
C++:

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.
    Futures parallel1.png Futures parallel2.png

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.

Siehe auch