Tutoriel : Utilisation des méthodes Future de la bibliothèque de programmation parallèle
Remonter à Tutoriels Bibliothèque de programmation parallèle
Sommaire
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 Delphi, choisissez Fichier > Nouveau > Application multi-périphérique - Delphi > Application vide.
- Pour C++Builder, choisissez Fichier > Nouveau > Application multi-périphérique - C++Builder > Application vide.
Ajout des composants
- Ajoutez deux composants TButton à la fiche.
- Définissez la propriété Text du premier bouton sur Start Future String. Ce bouton démarrera une exécution Future.
- 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 :
Dans Delphi, 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;
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;
}
Ensuite, ajoutez la déclaration suivante :
public
{ Public declarations }
FutureString: IFuture<string>;
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.
Pour les applications Delphi, ajoutez l'unité suivante à la clause uses, si elle n'est pas présente :
uses
System.Threading;
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.
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.