Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi XE 7 - Parallel Programming Library (https://www.delphipraxis.net/181678-xe-7-parallel-programming-library.html)

Sir Rufo 2. Sep 2014 16:12

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);

mkinzler 2. Sep 2014 16:16

AW: XE 7 - Parallel Programming Library
 
Zitat:

Gibts dann eigentlich auch ein "await" ?
Nicht Out-Of-The-Box aber leicht implementierbar:
Zitat:

Zitat von Chris Rolliston [url
http://delphifoundations.com/author/[/url] ]
Delphi-Quellcode:
type
  TTaskHelper = class helper for TTask
    class function Run<T>(const Sender: TObject; const Func: TFunc<T>;
      const CallOnReturn: TProc<TObject, T>): ITask; overload; static;
  end;
 
class function TTaskHelper.Run<T>(const Sender: TObject; const Func: TFunc<T>;
  const CallOnReturn: TProc<TObject, T>): ITask;
begin
  Result := Run(
    procedure
    var
      Value: T;
    begin
      Value := Func();
      TThread.Synchronize(nil,
        procedure
        begin
          CallOnReturn(Sender, Value);
        end);
    end);
end;
 
procedure TFormMain.Button1Click(Sender: TObject);
begin
  TTask.Run<string>(Self, LongTimeComing, FeedbackFromThread);
end;

http://docwiki.embarcadero.com/Libra...stem.Threading

mquadrat 2. Sep 2014 18:19

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?

Stevie 2. Sep 2014 18:41

AW: XE 7 - Parallel Programming Library
 
Zitat:

Zitat von mquadrat (Beitrag 1270743)
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?

Nö isses nich. Das ist ne asynchrone Aktion mit einer in den Hauptthread synchronisierten Aktion im Abschluss.
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.

mquadrat 3. Sep 2014 12:44

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.

Stevie 3. Sep 2014 13:36

AW: XE 7 - Parallel Programming Library
 
Zitat:

Zitat von mquadrat (Beitrag 1270872)
Kommt halt drauf an, was deine Tasks noch so können. Hatte mir bei DSharp damals nur das DataBinding angeschaut.

Die können nicht viel, ist nur nen kleiner Wrapper um nen TThread, ohne Threadpooling und den ganzen Zauber :)

Sir Rufo 3. Sep 2014 13:54

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 18:37 Uhr.
Seite 2 von 2     12   

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