Utilisation de TParallel.For de la bibliothèque de programmation parallèle

De RAD Studio
Aller à : navigation, rechercher

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


La bibliothèque de programmation parallèle (PPL) inclut une fonction boucle, TParallel.For, qui permet d'exécuter ses boucles en parallèle.

Dans les boucles parallèles, vous devez transformer vos opérations en opérations thread-safe. Vous pouvez utiliser des membres de l'unité System.SyncObjs, tels que les méthodes TInterlocked.

Conversion d'une boucle for en boucle TParallel.For

Delphi :

Boucle for Boucle TParallel.For
for I := 1 to 10 do
begin
  // …
end;
TParallel.For(1, 10, procedure(I: Integer)
  begin
    // …
  end);

C++ :

Si vous utiliser un compilateur C++ amélioré par Clang, vous pouvez utiliser les expressions lambda:

Boucle for Boucle TParallel.For
for (int i = 1; i <= 10; i++) {
  // …
}
TParallel::For(0, 10, TProc1<int>([](int I){
  // …
}));

Vous pouvez alternativement utiliser un functor, qui fonctionne avec les compilateurs de précédente génération et les compilateurs améliorés par Clang :

Boucle for Boucle TParallel.For
for (int i = 1; i <= 10; i++) {
  // (Loop logic)
}
class TMyFunctor : public TCppInterfacedObject<TProc__1<int> > {
public:
  void __fastcall Invoke(int I) {
    // (Loop logic)
  }
};

// …

TParallel::For(1, 10, System::DelphiInterface<TProc__1<int> >(new TMyFunctor()));

Si la boucle doit accéder a une ou plusieurs variables depuis le contexte à l'extérieur de la fonction callback, vous devez utiliser un functor comme suit :

  1. Déclarez une variable dans la classe functor pour contenir des copies ou des références aux variables dont vous avez besoin.
  2. Déclarez un constructeur de la classe functor qui accepte les copies ou les références à ces variables en tant que paramètres et initialise les variables functor correspondantes avec leurs valeurs.
  3. Transmettez ces variables au constructeur lorque vous instanciez le functor.
  4. Dans votre logique, dans Invoke(), vous pouvez accéder ) ces variables functor.

Par exemple :

class TMyFunctor : public TCppInterfacedObject<TProc__1<int> > {
public:
  TMyFunctor(int a, TB *b) : a(a), b(b) {}
  void __fastcall Invoke(int I) {
    // (Loop logic)
  }
  int a;
  TB *b;
};

// …

TParallel::For(1, 10, System::DelphiInterface<TProc__1<int> >(new TMyFunctor(a, b)));

Voir aussi