AW: XE 7 - Parallel Programming Library
Also im Code ist das doch sehr schön zu sehen
Delphi-Quellcode:
if FParallel then
begin // parallele Verarbeitung TParallel.For(Low(FOriginalBoard), High(FOriginalBoard), procedure (Value: Integer) begin ProcessCells(nil, Value); end); end else // sequentielle Verarbeitung for I := Low(FOriginalBoard) to High(FOriginalBoard) do ProcessCells(nil, I); |
AW: XE 7 - Parallel Programming Library
Zitat:
Zitat:
|
AW: XE 7 - Parallel Programming Library
mhh das muss ich mir mal morgens anschauen, wenn das Hirn noch nicht im Ruhemodus ist. Meine Lösung sieht so ganz anders aus :-)
EDIT: mhh ein wirklich await ist das aber nicht, oder? |
AW: XE 7 - Parallel Programming Library
Zitat:
Async/await für Delphi hab ich hier mal gebastelt. Für XE7 kann ich das auch einfach umstellen, dass System.Threading dafür als Backend hergenommen wird. |
AW: XE 7 - Parallel Programming Library
Kommt halt drauf an, was deine Tasks noch so können. Hatte mir bei DSharp damals nur das DataBinding angeschaut.
|
AW: XE 7 - Parallel Programming Library
Zitat:
|
AW: XE 7 - Parallel Programming Library
Nur mal so zum Spass so ein einfaches Parallel
Delphi-Quellcode:
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz