Delphi.cz

Český portál Delphi

XE7 - System.Threading - Future

XE7 přichází s novou jednotkou přímo v RTL a to System.Threading, která zjednodušuje paralelní programování. Jedná se o multiplatformní věc a mezi jinými umí ThreadPool, který podle zátěže přidává nebo odebírá další vlákna.

Jedním z konceptů je IFuture. Jedná se (aspoň tak to chápu) o přidání "vlákna" do threadpoolu s možností návratové hodnoty.

    class function Future<T>(Sender: TObject; Event: TFunctionEvent<T>): IFuture<T>; overload; static; inline;
    class function Future<T>(Sender: TObject; Event: TFunctionEvent<T>; APool: TThreadPool): IFuture<T>; overload; static; inline;
    class function Future<T>(const Func: TFunc<T>): IFuture<T>; overload; static; inline;
    class function Future<T>(const Func: TFunc<T>; APool: TThreadPool): IFuture<T>; overload; static; inline;

Ukáži na následujícím testovacím kódu (upozorňuji, že writeln není ThreadSafe, takže v reálném případě by měl být synchronizován).

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Threading;

var
  OneValue: IFuture <Integer>;
  i: Integer;

begin
  try
    OneValue := TTask.Future<Integer>(function: Integer
      var
        x: Integer;
      begin
        for x := 0 to 10 do
        begin
          Sleep(100);
          writeln('in paralel = '+x.ToString); // mel by byt synchronizovan
        end;
        Result := 10;
      end);
    // a dalsi vlakna
    writeln('before onevalue');
    I := OneValue.Value;
    writeln('after onevalue'+i.ToString);
    readln;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Po spuštění se přes Future přidá anonymní metoda do defaultního ThreadPoolu. V místě "další vlákna" je možno provádět další kód nebo další vlákna, přičemž již paralelně běží naše anonymní metoda. Volání Value pak počká na výsledek běhu příslušné anonymní metody z Future.

Mimochodem: IFuture je deklarována jako IFuture<T>, tj. do akce přichází generické typy. V našem případě je deklarován jako Integer;

Datum: 2014-09-09 23:39:00 Tagy: XE7, RTL, Threading, paralel,

Novinky v Delphi