vložil Radek Červinka
12. září 2014 23:32
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í.