Utilisation de TTask.lFuture de la bibliothèque de programmation parallèle

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation de la bibliothèque de programmation parallèle

IFuture implémente TTask pour lancer une fonction qui renvoie un type spécifique. Les instances de IFuture sont renvoyées par TTask.Future<T>, où le paramètre de type, T, représente le type de renvoi. En utilisant une instance de IFuture, vous pouvez calculer quelque chose ou exécuter une requête et en même temps faire d'autres tâches. Vous obtenez le résultat (la valeur) au moment de votre choix via IFuture.Value. A ce moment-là, si le calcul de la valeur n'est pas terminé, l'attente de ce calcul est bloquée. Cela vous permet de définir la priorité d'exécution des blocs de code, puis d'obtenir la valeur au moment où vous en avez besoin.

Delphi :

Au préalable, déclarez votre instance de IFuture<T>. Dans cet extrait de code, nous l'utilisons pour stocker une chaîne.

  public
    { Public declarations }
    FutureString: IFuture<string>;

L'implémentation transmise en tant que méthode anonyme à TTask.Future<T> :

FutureString:= TTask.Future<string>(
function:string
  begin
   {Some calculation that takes time}
    Sleep(3000);
    Result:='Hello ' + Random(42).ToString;
  end);

Vous pouvez obtenir la valeur calculée en appelant IFuture.Value :

MyString := FutureString.Value;
C++ :

Au préalable, déclarez votre instance de IFuture<T>. Dans cet extrait de code, nous l'utilisons pour stocker une chaîne. Vous devez également déclarer la méthode qui contient l'implémentation de la méthode gestionnaire TTask.Future<T>.

public:		// User declarations
	System::DelphiInterface<IFuture__1<System::String> > FutureString;
	System::String __fastcall FutureHandler(TObject* Sender);

L'implémentation de la méthode gestionnaire TTask.Future<T> et l'appel à cette méthode :

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);

Vous pouvez obtenir la valeur calculée en appelant IFuture.Value :

MyString = FutureString->Value;

Voir aussi