Tutoriel : Utilisation des méthodes Future de la bibliothèque de programmation parallèle

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Tutoriels Bibliothèque de programmation parallèle

Ce tutoriel explique comment utiliser les méthodes Future de la bibliothèque de programmation parallèle (PPL). Une méthode Future est une classe TTask qui renvoie un résultat ; elle peut donc être considérée comme une fonction parallèle.

Ce tutoriel présente une application simple avec deux boutons. L'un d'eux démarre le calcul et l'autre renvoie la valeur. A l'aide des méthodes Future, vous obtenez cette valeur lorsque vous la demandez et, si elle n'est pas déjà calculée, l'opération est bloquée jusqu'à ce que le calcul soit terminé.

Création du projet

Créez un nouveau projet :

  • Pour Object Pascal, choisissez Fichier > Nouveau > Application multi-périphérique - Object Pascal > Application vide.
  • Pour C++, choisissez Fichier > Nouveau > Application multi-périphérique - CBuilderUI > Application vide.

Ajout des composants

  1. Ajoutez deux composants TButton à la fiche.
  2. Définissez la propriété Text du premier bouton sur Start Future String. Ce bouton démarrera une exécution Future.
  3. Définissez la propriété Text de l'autre bouton sur Request Future String. Ce bouton demandera le résultat.

Implémentation de la fonctionnalité TTask.Future

Commencez par implémenter les gestionnaires d'événement pour les événements OnClick des boutons Start Future String et Request Future String. Pour cela, écrivez le code comme suit :

Object Pascal :

Dans Object Pascal, la fonction est transmise à TTask.Future en tant que méthode anonyme.

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);
  return System::String str = System::String().sprintf(L"Hello %d", Random(42));
}
void __fastcall TForm1::Button2Click(TObject *Sender){
  Button2->Text = FutureString->Value;
}

Ensuite, ajoutez la déclaration suivante :

  public
    { Public declarations }
    FutureString: IFuture<string>;
C++:
public:		// User declarations
	System::DelphiInterface<IFuture__1<System::String> > FutureString;
	System::String __fastcall FutureHandler(TObject* Sender);

Enfin, incluez les bibliothèques nécessaires dans le code.

Object Pascal :

Pour les applications Object Pascal, ajoutez l'unité suivante à la clause uses, si elle n'est pas présente :

uses
  System.Threading;
C++:

Pour les applications C++, ajoutez l'opérateur include suivant au fichier d'en-tête du projet :

#include <System.Threading.hpp>

Exécution de l'application

A ce stade, vous pouvez exécuter l'application :

  • Appuyez sur F9 ou choisissez Exécuter > Exécuter.
    Futures parallel1.png Futures parallel2.png

Appuyez sur Start Future String pour exécuter la procédure, puis appuyez sur Request Future String pour obtenir le résultat. Veuillez noter que tant que le calcul de la valeur n'est pas terminé, l'application est mise en attente. Sinon, le résultat s'affiche immédiatement.

Voir aussi