XE7 - System.Threading - Task

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í.

Tagy: ,

Novinky v Delphi

Komentáře

23.9.2014 22:49:53 #

frantisek

dalo by sa to nejako pouzit na cyklus, kde sa impotuju udaje z XML do Db?

frantisek

24.9.2014 10:35:56 #

radekc

Principiálně ano, jen by při ukládání musel každý Task mít vlastní Connection - tedy v závislosti na DB, protože většina DB neumožňuje nad jednou connection provádět paralelní operace.

radekc

3.10.2014 1:38:53 #

Igor Gottwald

Já osobně si myslím, že zpracování XML nebude úplně úloha vhodná pro vícevláknové zpracování, pokud tedy není potřeba nad již načtenými daty provádět nějaké náročné operace.
Ale pokud by se nad tím někdo chtěl zamyslet a trošku zaexperimentovat, tak jsem na http://www.uschovna.cz/zasilka/BA3ZZVEBLIGRK67T-3RN/ nahrál testovací XML databázi. Zabalené v 7-zip to má 70 MB, ale uvnitř je téměř 2 GB XML obsahující 14,6 mil řádků aktuální databáze neplatných dokladů MV ČR (je to obsahově stejný soubor, jako lze v CSV stáhnout z http://aplikace.mvcr.cz/neplatne-doklady/). Takže zpracování takového souboru už je trošku oříšek, jednak se Win32 aplikaci nevejde do paměti (TXMLDocument to nedá), a za další i jen jeho prosté přečtení trvá slušnou dobu - načtení všech bytů souboru z mého SSD disku trvá asi 8 sekund (1033 MB/s, ale je tam velká režie, teoreticky by to mělo být za 1,7 sekundy), z HDD to pak trvá asi 40 sekund (<60 MB/s).

Igor Gottwald

3.10.2014 11:44:10 #

radekc

Já si dokáži představit procházení XML a nad každým uzlem provádět nějaké Inet dotazy, s tím, že výsledek se zapíše zpátky do toho uzlu. Ale je to omezená množina použití.

radekc

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ů