Verwenden von TParallel.For aus der Parallel Programming Library

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Verwenden der Parallel Programming Library


Die Parallel Programming Library (PPL) enthält eine Schleifen-Funktion, TParallel.For, mit der Sie deren Schleifen parallel ausführen können.

In parallelen Schleifen können Sie Ihre Operationen in thread-sichere Operationen umwandeln. Sie können Elemente der System.SyncObjs-Unit verwenden, wie TInterlocked-Methoden.

Konvertieren einer Schleife in eine TParallel.For-Schleife

Delphi:

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

C++:

Wenn Sie einen durch Clang erweiterte C++-Compiler verwenden, können Sie Lambda-Ausdrücke verwenden:

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

Sie können alternativ einen Funktor verwenden, der mit beiden Compilern einer vorherigen Generation und durch Clang erweiterte Compilern funktioniert:

For-Schleife TParallel.For-Schleife
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()));

Wenn die Schleife Zugriff auf eine oder mehrere Variablen außerhalb der Callback-Funktion benötigt, müssen Sie einen Funktor wie folgt verwenden:

  1. Deklarieren Sie Variablen in dieser Funktor-Klasse, um Kopien oder Referenzen von den Variablen, die Sie benötigen, zu erhalten.
  2. Deklarieren Sie einen Konstruktor der Funktor-Klasse, die die Kopien oder Referenzen von diesen Variablen als Parameter akzeptiert und die entsprechenden Funktor-Variablen mit ihren Werten initialisiert.
  3. Übergeben Sie diese Variablen an den Konstruktor, wenn Sie den Funktor instantiieren.
  4. In Ihrer Logik, in Invoke(), können Sie auf diese Funktor-Variablen zugreifen.

Zum Beispiel:

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

Siehe auch