XE7 - System.Threading - Future

vložil Radek Červinka 10. září 2014 00:39

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;

Tagy: , , ,

Novinky v Delphi

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců