unit Parallel;
interface
uses
System.SysUtils;
type
TParallel =
class
class procedure Execute( ALow, AHigh : Int64; AProc : TProc<Int64> );
end;
implementation
uses
System.Generics.Collections,
System.SyncObjs,
System.Classes;
{ TParallel }
class procedure TParallel.Execute( ALow, AHigh : Int64; AProc : TProc<Int64> );
procedure BuildThread( AEvent : TEvent; AValue : Int64 );
var
LThread : TThread;
begin
// Event zurücksetzen
AEvent.ResetEvent;
// Anonymen Thread erzeugen
LThread := TThread.CreateAnonymousThread(
procedure
begin
// Arbeit ausführen
AProc( AValue );
// Event setzen
AEvent.SetEvent;
end );
// Thread starten
LThread.Start;
end;
var
LMaxThreads : Integer;
LThread : TThread;
LIdx : Integer;
LEvents : TList<TEvent>;
LEventArray : THandleObjectArray;
LSignaled : THandleObject;
LEvent : TEvent;
LIter : Int64;
begin
// Events vorbereiten
LMaxThreads := TThread.ProcessorCount;
LEvents := TObjectList<TEvent>.Create( True );
LEvents.Capacity := LMaxThreads;
SetLength( LEventArray, LMaxThreads );
for LIdx := low( LEventArray )
to high( LEventArray )
do
begin
LEvent := TEvent.Create(
nil, True, True, '
' );
LEvents.Add( LEvent );
LEventArray[LIdx] := LEvent;
end;
// Jetzt wird es parallel
LIter := ALow;
while LIter <= AHigh
do
begin
// Warten, bis EIN Event wieder frei ist
TEvent.WaitForMultiple( LEventArray, INFINITE, False, LSignaled );
BuildThread( LSignaled
as TEvent, LIter );
Inc( LIter );
end;
// Warten, bis ALLE Events wieder frei sind
TEvent.WaitForMultiple( LEventArray, INFINITE, True, LSignaled );
end;
end.