并行
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_TParallel.For_from_the_Parallel_Programming_Library
Using TParallel.For from the Parallel Programming Library
Go Up to Using the Parallel Programming Library
The Parallel Programming Library (PPL) includes a loop function, TParallel.For, that allows to run its loops in parallel.
Within parallel loops, you must transform your operations into thread-safe operations. You can use members of the System.SyncObjs unit, such as TInterlocked methods.
Converting a For Loop into a TParallel.For
Loop
Delphi:
For Loop | TParallel.For Loop |
---|---|
for I := 1 to 10 do begin // … end;
|
TParallel.For(1, 10, procedure(I: Integer) begin // … end);
|
C++:
If you are using a Clang-enhanced C++ compiler, you can use lambda expressions:
For Loop | TParallel.For Loop |
---|---|
for (int i = 1; i <= 10; i++) { // … }
|
TParallel::For(0, 10, TProc1<int>([](int I){ // … }));
|
You can alternatively use a functor, which works with both previous-generation compilers and Clang-enhanced compilers:
For Loop | TParallel.For Loop |
---|---|
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()));
|
If the loop needs access to one or more variables from the context outside the callback function, you must use a functor as follows:
- Declare variables in the functor class to hold copies or references to the variables that you need.
- Declare a constructor of the functor class that accepts the copies or references to those variables as parameters and initializes the corresponding functor variables with their values.
- Pass those variables to the contructor when you instantiate the functor.
- In your logic, in
Invoke()
, you can access those functor variables.
For example:
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)));
分类方法
TTest = class;
// Declaring metaclass type
TTestClass = class of TTest; TTest = class public // Class methods class function add(I, J: Integer): Integer; class function GetClsName: string; // Virtual class method class function GetClsNameVirt: string; virtual; // Class getter and setter class function GetCount: Integer; class procedure SetCount(I: Integer); // Virtual class getter and setter class function GetStrProp: string; virtual; class procedure SetStrProp(N: string); virtual; // Class static class function GetStaticCount: Integer; static; class procedure SetStaticCount(I: Integer); static; // Class properties property Count: Integer read GetCount write SetCount; // Non-virtual property StrProp: string read GetStrProp write SetStrProp; // Virtual g/setters end; // Function that takes a class reference function RegisterTestType(Cls: TTestClass): boolean;
基本句法元素(Delphi)
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Fundamental_Syntactic_Elements_(Delphi)
程序和功能(德尔福)
表达式(德尔福)
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Expressions_(Delphi)
编译器属性 volatile
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiler_Attributes#Volatile
System.TimeSpan.TTimeSpan
http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.TimeSpan.TTimeSpan
使用并行编程库
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_the_Parallel_Programming_Library
简单类型(Delphi)
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Simple_Types_(Delphi)