Verwenden von TParallel.For aus der Parallel Programming Library
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:
- Deklarieren Sie Variablen in dieser Funktor-Klasse, um Kopien oder Referenzen von den Variablen, die Sie benötigen, zu erhalten.
- 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.
- Übergeben Sie diese Variablen an den Konstruktor, wenn Sie den Funktor instantiieren.
- 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)));