System.Threading.TParallel.For

提供: Appmethod Libraries
移動先: 案内検索

Object Pascal

class function &For(Sender: TObject; ALowInclusive, AHighInclusive: Integer; AIteratorEvent: TIteratorEvent): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; ALowInclusive, AHighInclusive: Integer; AIteratorEvent: TIteratorEvent; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; ALowInclusive, AHighInclusive: Integer; AIteratorEvent: TIteratorStateEvent): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; ALowInclusive, AHighInclusive: Integer; AIteratorEvent: TIteratorStateEvent; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; AStride, ALowInclusive, AHighInclusive: Integer; AIteratorEvent: TIteratorEvent): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; AStride, ALowInclusive, AHighInclusive: Integer; AIteratorEvent: TIteratorEvent; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; AStride, ALowInclusive, AHighInclusive: Integer; AIteratorEvent: TIteratorStateEvent): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; AStride, ALowInclusive, AHighInclusive: Integer; AIteratorEvent: TIteratorStateEvent; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer>): TLoopResult; overload; static; inline;
class function &For(ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer>; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer, TLoopState>): TLoopResult; overload; static; inline;
class function &For(ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer, TLoopState>; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(AStride, ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer>): TLoopResult; overload; static; inline;
class function &For(AStride, ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer>; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(AStride, ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer, TLoopState>): TLoopResult; overload; static; inline;
class function &For(AStride, ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer, TLoopState>; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; ALowInclusive, AHighInclusive: Int64; AIteratorEvent: TIteratorEvent64): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; ALowInclusive, AHighInclusive: Int64; AIteratorEvent: TIteratorEvent64; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; ALowInclusive, AHighInclusive: Int64; AIteratorEvent: TIteratorStateEvent64): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; ALowInclusive, AHighInclusive: Int64; AIteratorEvent: TIteratorStateEvent64; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; AStride, ALowInclusive, AHighInclusive: Int64; AIteratorEvent: TIteratorEvent64): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; AStride, ALowInclusive, AHighInclusive: Int64; AIteratorEvent: TIteratorEvent64; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; AStride, ALowInclusive, AHighInclusive: Int64; AIteratorEvent: TIteratorStateEvent64): TLoopResult; overload; static; inline;
class function &For(Sender: TObject; AStride, ALowInclusive, AHighInclusive: Int64; AIteratorEvent: TIteratorStateEvent64; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(ALowInclusive, AHighInclusive: Int64; const AIteratorEvent: TProc<Int64>): TLoopResult; overload; static; inline;
class function &For(ALowInclusive, AHighInclusive: Int64; const AIteratorEvent: TProc<Int64>; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(ALowInclusive, AHighInclusive: Int64; const AIteratorEvent: TProc<Int64, TLoopState>): TLoopResult; overload; static; inline;
class function &For(ALowInclusive, AHighInclusive: Int64; const AIteratorEvent: TProc<Int64, TLoopState>; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(AStride, ALowInclusive, AHighInclusive: Int64; const AIteratorEvent: TProc<Int64>): TLoopResult; overload; static; inline;
class function &For(AStride, ALowInclusive, AHighInclusive: Int64; const AIteratorEvent: TProc<Int64>; APool: TThreadPool): TLoopResult; overload; static; inline;
class function &For(AStride, ALowInclusive, AHighInclusive: Int64; const AIteratorEvent: TProc<Int64, TLoopState>): TLoopResult; overload; static; inline;
class function &For(AStride, ALowInclusive, AHighInclusive: Int64; const AIteratorEvent: TProc<Int64, TLoopState>; APool: TThreadPool): TLoopResult; overload; static; inline;

C++

static TLoopResult __fastcall For(System::TObject* Sender, int ALowInclusive, int AHighInclusive, TIteratorEvent AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, int ALowInclusive, int AHighInclusive, TIteratorEvent AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, int ALowInclusive, int AHighInclusive, TIteratorStateEvent AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, int ALowInclusive, int AHighInclusive, TIteratorStateEvent AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, int AStride, int ALowInclusive, int AHighInclusive, TIteratorEvent AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, int AStride, int ALowInclusive, int AHighInclusive, TIteratorEvent AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, int AStride, int ALowInclusive, int AHighInclusive, TIteratorStateEvent AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, int AStride, int ALowInclusive, int AHighInclusive, TIteratorStateEvent AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(int ALowInclusive, int AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__1<int> > AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(int ALowInclusive, int AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__1<int> > AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(int ALowInclusive, int AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__2<int,TLoopState*> > AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(int ALowInclusive, int AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__2<int,TLoopState*> > AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(int AStride, int ALowInclusive, int AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__1<int> > AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(int AStride, int ALowInclusive, int AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__1<int> > AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(int AStride, int ALowInclusive, int AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__2<int,TLoopState*> > AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(int AStride, int ALowInclusive, int AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__2<int,TLoopState*> > AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, __int64 ALowInclusive, __int64 AHighInclusive, TIteratorEvent64 AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, __int64 ALowInclusive, __int64 AHighInclusive, TIteratorEvent64 AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, __int64 ALowInclusive, __int64 AHighInclusive, TIteratorStateEvent64 AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, __int64 ALowInclusive, __int64 AHighInclusive, TIteratorStateEvent64 AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, __int64 AStride, __int64 ALowInclusive, __int64 AHighInclusive, TIteratorEvent64 AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, __int64 AStride, __int64 ALowInclusive, __int64 AHighInclusive, TIteratorEvent64 AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, __int64 AStride, __int64 ALowInclusive, __int64 AHighInclusive, TIteratorStateEvent64 AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(System::TObject* Sender, __int64 AStride, __int64 ALowInclusive, __int64 AHighInclusive, TIteratorStateEvent64 AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(__int64 ALowInclusive, __int64 AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__1<__int64> > AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(__int64 ALowInclusive, __int64 AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__1<__int64> > AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(__int64 ALowInclusive, __int64 AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__2<__int64,TLoopState*> > AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(__int64 ALowInclusive, __int64 AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__2<__int64,TLoopState*> > AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(__int64 AStride, __int64 ALowInclusive, __int64 AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__1<__int64> > AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(__int64 AStride, __int64 ALowInclusive, __int64 AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__1<__int64> > AIteratorEvent, TThreadPool* APool)/* overload */;
static TLoopResult __fastcall For(__int64 AStride, __int64 ALowInclusive, __int64 AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__2<__int64,TLoopState*> > AIteratorEvent)/* overload */;
static TLoopResult __fastcall For(__int64 AStride, __int64 ALowInclusive, __int64 AHighInclusive, const System::DelphiInterface<System::Sysutils::TProc__2<__int64,TLoopState*> > AIteratorEvent, TThreadPool* APool)/* overload */;

プロパティ

種類 可視性 ソース ユニット
function public
System.Threading.pas
System.Threading.hpp
System.Threading TParallel


説明

一連の整数インデックス値を反復処理し、反復ごとにイベント ハンドラを呼び出して、これらの呼び出しをどれも並列スレッドで処理できるようにします。

イテレータ イベントが並列スレッドで処理されるかどうかは、使用可能なスレッド処理リソースおよび機能によって決まります。For という名前から言語の for ループ構文と同等かと思われるかもしれませんが、TParallel.For では複数の反復イベントを同時に実行することができます。つまり、言語の通常の for ループのように 1 つずつ順に実行するのではなく、並列に実行できるのです。

TParallel.For の各オーバーロード メソッドでは、本質的に同じ操作を実行しますが、オーバーロード メソッドごとにパラメータが異なるため、実行時の機能や情報が異なります。

TParallel.For のオーバーロード メソッドはすべて、TParallel.TLoopResult インスタンスを返します。TParallel.For イテレータ イベントのすべての反復の実行が完了すると、TParallel.For から返される TLoopResult インスタンスの Completed プロパティが True に設定されます。

TParallel.For のオーバーロード メソッドに <Sender> パラメータがある場合、呼び出し元から渡されたオブジェクト インスタンスは、各反復で <Sender> パラメータとしてイテレータ イベントに送られます。これは Appmethod の他のイベント ハンドラの場合と同じです。TParallel.For のオーバーロード メソッドのうち、<Sender> パラメータを伴わないものは、各反復で nil を <Sender> パラメータとしてイテレータ イベントに渡します。

TParallel.For のすべてのオーバーロード メソッドには <ALowInclusive> パラメータと <AHighInclusive> パラメータがあります。これらは Integer 値か Int64 値のどちらかで、それぞれ反復の下限と上限を表します。つまり、<ALowInclusive> の値が 1 に、<AHighInclusive> の値が 4 にそれぞれ設定されている場合、イテレータ イベントは 1 から 4 までの想定される値ごとに実行されます。

<AStride> パラメータを使用すれば、パフォーマンスを調整することができます。"並列 for" ループでは、スレッド プールを使用して作業のスケジューリングを行います。作業パケットが非常に小さい場合、スレッド プール内の同期オーバーヘッドでパフォーマンスが左右されるおそれがあります。<AStride> パラメータが 1 より大きい場合、<AStride> インデックスが単一の作業にまとめられます。これにより、ループでの並列処理の低下と引き換えに、同期オーバーヘッドにかかる時間が短縮されます。

イテレータ イベント ハンドラは、反復の範囲のサイズ(Integer または Int64)と TParallel.TLoopState の有無によって区別されます。<Sender> パラメータを伴うメソッド型の下記宣言を参照してください。

  TIteratorEvent = procedure (Sender: TObject; AIndex: Integer) of object;
  TIteratorStateEvent = procedure (Sender: TObject; AIndex: Integer; const LoopState: TLoopState) of object;
  TIteratorEvent64 = procedure (Sender: TObject; AIndex: Int64) of object;
  TIteratorStateEvent64 = procedure (Sender: TObject; AIndex: Int64; const LoopState: TLoopState) of object;

<Sender> オブジェクトが必要ない場合は、手続きの参照もイテレータ イベントに適しています。そのため、無名メソッドをイテレータ イベント ハンドラとして使用することもできます。

イテレータ イベントで反復そのものを制御する必要がある場合は、TParallel.TLoopState パラメータを使用するものをイテレータ イベント ハンドラにしなければなりません。このパラメータがあると、イベント ハンドラには TParallel.TLoopState のインスタンスが渡されるため、それに基づいて状態情報(FaultedStoppedShouldExit のいずれか)を監視したり、Break メソッドや Stop メソッドで反復ループそのものを制御することができます。

TThreadPool 型の <APool> パラメータが指定される場合は、その TThreadPool.SetMinWorkerThreads メソッドと TThreadPool.SetMaxWorkerThreads メソッドを使って、TParallel.For の反復イベントで使用できるスレッド リソースをプログラム側で制御することができます。ただし、これらのメソッドを呼び出す場合は、同時スレッドが多すぎるとオーバーヘッドが発生して、ルーチンを並列に実行するメリットが減ったりなくなるおそれがあるため、注意が必要です。

関連項目