From the TParallel.For
documentation:
如果從事件迭代所需本身迭代控制,迭代器的事件處理程序應使用TParallel.TLoopState
參數之一。當存在時,事件處理器將被給出TParallel.TLoopState
的實例,從Faulted
,Stopped
或ShouldExit
的狀態信息可以被監控,或者迭代循環本身可以用方法Break
或Stop
來控制。
跟蹤LoopState的方法是使用一種方法具有以下簽名:
TIteratorStateEvent =
procedure (Sender: TObject; AIndex: Integer; const LoopState: TLoopState) of object;
或者使用其匿名版本:
class function &For(AStride, ALowInclusive, AHighInclusive: Integer;
const AIteratorEvent: TProc<Integer, TLoopState>; APool: TThreadPool): TLoopResult;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果文檔失敗的最簡單方法是搜索類的源代碼,或讓代碼完成工作。
TLoopState = class
private [...]
public
procedure Break;
procedure Stop;
function ShouldExit: Boolean; <<-- this looks useful
property Faulted: Boolean read GetFaulted;
property Stopped: Boolean read GetStopped; <<-- or this
property LowestBreakIteration: Variant read GetLowestBreakIteration;
end;
例:
procedure TForm1.btnParallelForClick(Sender: TObject);
var
Tot: Integer;
SW: TStopwatch;
begin
try
// counts the prime numbers below a given value
Tot :=0;
SW :=TStopWatch.Create;
SW.Start;
//Use a method that supports LoopState
TParallel.For(2,1,Max,procedure(I:Int64; State: TLoopState)
begin
//check loopstate every now and again.
if State.ShouldExit then exit;
if IsPrime(I) then TInterlocked.Increment(Tot);
end);
SW.Stop;
Memo1.Lines.Add(Format('Parallel For loop. Time (in milliseconds): %d - Primes found: %d', [SW.ElapsedMilliseconds,Tot]));
except on E:EAggregateException do
ShowMessage(E.ToString);
end;
end;
「如果從事件迭代所需本身迭代控制,迭代器的事件處理程序使用TParallel.TLoopState參數應該是一個當存在時,事件處理程序將給定一個TParallel.TLoopState的實例,從中可以監視來自Faulted,Stopped或ShouldExit的狀態信息,或者可以使用Break或Stop方法來控制迭代循環本身。「 –
這就是['TParallel.For'文檔](http://docwiki.embarcadero.com/Libraries/en/System.Threading.TParallel.For) –
這裏是一個例子:[我怎樣才能使用TTask .WaitForAny來自新的線程庫?](http://stackoverflow.com/a/29078846/576719) –