Programare paralelă în delphi xe7

În Delphi XE7, a fost inclusă o bibliotecă pentru programare paralelă. Pentru ao folosi, conectați unitatea System.Threading. Să vedem ce este în această bibliotecă și cum poate fi folosită.





Biblioteca de programare paralelă (PPL) rulează pe Windows. MacOSX. Dispozitivele Android și iOS și permite aplicațiilor dvs. să execute sarcini în paralel, profitând astfel de dispozitive multiprocesor sau computere. Biblioteca PPL vă va permite să executați sarcini, să le îmbinați, să așteptați finalizarea grupului de activități și multe altele. Pentru toate acestea, biblioteca are reglabil automat (în funcție de sarcină CPU) piscină fir (a se vedea. Clasa TThreadPool), care va face să uitați despre crearea și controlul fluxului.







Folosind biblioteca PPL puteți ușor:

- creați bucle folosind structura TParallel.For;
- executați sarcini paralele utilizând TTask și ITask;
- aruncați procesul de funcționare, concentrându-vă asupra altor sarcini, apoi obțineți rezultatul acestui proces în punctul dorit.

Utilizând TTask

TTask este o clasă care vă permite să executați o sarcină sau mai multe sarcini în paralel. În acest caz, nu trebuie să creați și să gestionați fluxul. Clasa TTask implementează interfața ITask. ITask interfață la dispoziția dumneavoastră există o funcție pentru a începe (Start), în așteptare (așteptare) și anula (Anulare) sarcini și statutul (Stare), vă permite să știi ce se întâmplă cu sarcina. Aici sunt stările posibile de sarcini: Creat (task creat), WaitingToRun (sarcina este în așteptare pentru sfârșitul executării unui alt proces), alergare (sarcină este executată), completat (sarcină finalizată), WaitingForChildren (sarcina este în așteptare pentru sfârșitul punerii în aplicare a sarcinii filialei), a anulat (sarcina a fost anulată) Excepție (o eroare în timpul executării sarcinii).

Să vedem acum cum să creați și să executați o sarcină. Pentru aceasta, creați o clasă TTask. transmiterea unei proceduri către constructorul de clasă care va fi executată în fir și apoi apelați funcția Start.

Acum, să încercăm mai multe sarcini în paralel. Pentru a face acest lucru, trebuie să creați o serie de sarcini, să executați sarcini și să așteptați să fie difuzate. Există două funcții statice pentru clasa TTask pentru așteptare. WaitForAll (așteptați toate sarcinile) și WaitForAny (așteptați cel puțin una dintre sarcinile care urmează să fie executate).

Și, în sfârșit, un alt exemplu în care voi arăta cum să accesați proprietățile și formele de control al procedurii de sarcină, cum se verifica starea problemei și modul de a anula executarea sa.

Utilizarea TParallel.For

Funcția statică pentru funcția din clasa TParallel vă permite să efectuați cu ușurință funcția într-o buclă paralelă. Ca exemplu, luați în considerare algoritmul pentru găsirea numerelor prime. Funcția care determină dacă un număr este prime va fi după cum urmează:

Gama clasică de sortare a numerelor și de numărare a numerelor prime găsite va arăta astfel:

Pentru a realiza o buclă paralelă în acest caz, puteți înlocui instrucțiunea pentru cu o funcție a clasei TParallel.For și înlocuiți codul buclă într-o funcție anonimă.

Acum, să vedem cum să renunțăm la bucla TParallel.For. Să presupunem că trebuie să găsim cel puțin 1000 de numere prime și apoi să rupem buclele. Acesta este modul în care devine codul nostru.

Utilizarea TTask.Future

Folosind interfața IFuture puteți găsi ceva sau de a efectua orice interogare în paralel care efectuează alte sarcini, și pentru a obține rezultatul în momentul în care veți avea nevoie de ea. Dacă în acest moment valoarea nu este încă pregătită, firul solicitant va fi blocat până la primirea valorii. Acest lucru vă permite să acorde prioritate blocuri de cod pentru a le executa într-o anumită ordine, și în același timp, asigurați-vă că veți obține o valoare la un anumit punct.

Să facem un exemplu simplu de utilizare a interfeței IFuture. Mai întâi, executați sarcina și încercați să obțineți imediat valoarea. În exemplul următor, programul va întrerupe până la finalizarea sarcinii.

Iată un exemplu, când un program cere un rezultat după ce sarcina a funcționat deja. În acest caz, rezultatul va fi obținut imediat.

Gestionarea filei TThreadPool

Puteți obține instanța curentă a clasei TThreadPool din proprietatea clasei TThreadPool.Default. din care puteți conta sau din care puteți schimba numărul maxim și cel minim de fire. Cum se face acest lucru este prezentat în exemplu.

Merită folosită biblioteca de programare paralelă Delphi?

Răspunsul la această întrebare este neechivoc: bineînțeles. Puteți mări performanța aplicațiilor existente printr-o piscină de filere automată care va profita de procesoarele multi-core. În plus, dacă utilizați fluxuri, biblioteca de programare paralelă PPL va reduce dimensiunea codului și va îmbunătăți lizibilitatea sa, care nu se poate bucura. Mai ales este de remarcat ușurința utilizării firelor și ciclurilor de paralelizare.







Articole similare

Trimiteți-le prietenilor: