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,