Delphi.cz

Český portál Delphi

XE7 - System.Threading - Task

V pokračování minulého článku ukáži pravděpodobně nejčastější použití System.Threading - použití TTask, přidání úlohy do poolu. Příklad jsem si vypůjčil z blogu Embarcadera.

implementation
uses
  System.Threading, System.SyncObjs;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 tasks: array of ITask;
 value: Integer;
begin
 Setlength (tasks, 2);
 value := 0;

 tasks[0] := TTask.Create (procedure ()
   begin
     sleep (3000); // 3 seconds
     TInterlocked.Add (value, 3000);
   end);
 tasks[0].Start;

 tasks[1] := TTask.Create (procedure ()
   begin
     sleep (5000); // 5 seconds
     TInterlocked.Add (value, 5000);
   end);
 tasks[1].Start;

 TTask.WaitForAll(tasks);
// TTask.WaitForAny(tasks);
 ShowMessage ('All done: ' + value.ToString);
end;

Tím, že je provedeno paralelní zpracování bude výsledek k dispozici za cca 5s (tj. čas nejdelšího úkolu).

Nabízejí se další možnosti, např. chceme opakovat nějaký výpočet lišící se indexem, můžeme použít jednu z variantu TParalel.For

 TParallel.For(1, 10, (procedure (i:Integer)
  begin
     sleep (1000);
  end));

  ShowMessage('konec');

Předaný index odpovídá iterované hodnotě, např. sloupci matice. Program je dokončen v závislosti na možnostech procesoru, v nejlepším případě po cca 1s (je nutno započítat nějaký drobný overhead), v nejhorším v 10s.

Samozřejmě tohle je nástin možností.

Datum: 2014-09-12 22:32:00 Tagy: XE7, Threading

Novinky v Delphi