Delphi & Thread

Delphi & Thread

Postby soltare » 21 Aug 2010, 15:27

As dori o reamintire cum sa folosesc thread pentru a vedea o bara de progres legata de durata unei activitati, spre exemplu o interogare baza de date populeaza un StringGrid. Multumesc anticipat pentru orice idee/sfat !
0,0p / 0 votes
User avatar
soltare
 
Joined: 16 Aug 2010
Location: Undeva in sud
Status: 0

Re: Delphi & Thread

Postby DarkByte » 24 Aug 2010, 15:40

Thread-urile sunt, intr-adevar, o problema destul de delicata in programare.

Ai mai jos atasat un program Delphi (exe + sursa) care adauga linii intr-un TStringGrid, facand update si progress la fiecare linie adaugata. Totul se face intr-un mod sincronizat.

Adaugarea liniilor + update-ul vizual : se fac din thread, folosind Synchronize.

Codul e doar partial comentat, dar cred ca e destul de clar. Pentru orice intrebari, ask here.

Bafta

P.S. proiectul initial nu compila pe Delphi 6 sau mai mic. Am scos XPManifest-ul de pe forma, plus uniturile XPMan si Variants si acum e ok.
0,0p / 0 votes
Attachments
ThreadProgress_src.zip
(8.53 KiB) Downloaded 29 times
ThreadProgress_exe.zip
(232.82 KiB) Downloaded 26 times
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Delphi & Thread

Postby v0id » 18 Sep 2010, 20:47

Tisk, tisk... Ce ma mai superi DarkByte ~X(

Desi aplicatia creeaza un thread secundar, ea functioneaza tot ca si una single-threaded. Test simplu: i-am dat sa-mi adauge 50.000 de linii, i-am dat "Populate" si in timp ce progress-ul crestea, am incercat sa mut fereastra cu mouse-ul. N-a raspuns pana cand operatia nu s-a incheiat. Intr-o aplicatie multi-threaded, trebuia sa pot muta fereastra in timpul executiei thread-ului secundar. Sincer, ma mir ca face macar update la progress.

In fine, motivul pentru care se comporta asa este ca din thread-ul principal ai apelat direct metoda Execute a thread-ului secundar. Asta inseamna ca acea metoda se executa in thread-ul principal. Trebuia apelata metoda Resume in loc de execute.


Pentru sufletul lui soltare, as mai mentiona doua chestiuni:

1. Thread-ul secundar ar trebui sa verifice periodic in metoda Execute daca s-a cerut terminarea lui (adica daca proprietatea Terminated este True) . In exemplul scris de DarkByte, for-ul din metoda Execute este locul ideal unde se poate verifica proprietatea Terminated. Utilitatea acestei verificari apare daca de exemplu adaugi un buton de Cancel pe fereatra, prin care vrei sa opresti popularea TStringGrid-ului. La click pe butonul Cancel vei apela metoda Terminate a thread-ului secundar, dar cat de repede se va incheia executia depinde numai de cat de frecvent verifici proprietatea Terminated in thread.

2. De obicei, cand un thread secundar si-a incheiat executia noi nu mai avem nevoie de el. Totusi, obiectul respectiv trebuie distrus si memoria ocupata de acesta eliberata. Pentru ca noi sa nu verificam periodic din alta parte a programului starea thread-ului pentru a sti cand si-a incheiat executia si poate fi distrus, putem folosi proprietatea FreeOnTerminate a clasei TThread. Daca setam FreeOnTerminate pe True (de obicei in constructorul thread-ului), cand thread-ul isi va incheia executia va fi distrus automat, iar memoria ocupata de acesta va fi eliberata.

Din pacate, nu pot compila un exemplu acum pentru ca nu am Delphi la indemana, dar te poti juca si tu un pic cu astea ca sa vezi ce si cum.

De asemenea, iti recomand un tutorial pentru threading in Delphi care mie mi se pare foarte bun.
0,0p / 0 votes
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.
User avatar
v0id
Word
 
Joined: 05 Jan 2010
Location: 127.0.0.1
Status: 42.5

Re: Delphi & Thread

Postby DarkByte » 19 Sep 2010, 00:24

Acum sunt in dubii ... imi era dor de tine pe Bitcell ? ... nu-mi era dor ? ... :-?? :D

Either way, ai dreptate, mi-a scapat chestia - am facut in viteza si n-am remarcat. In mini-tutorialul meu despre thread-uri e bine.

Merci de completari :) (le poti regasi, cel putin in mare, in linkul de mai sus)
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Delphi & Thread

Postby v0id » 19 Sep 2010, 21:47

Sorry daca reply-ul meu a sunat dur. Nu asta era ideea... Eu stiu ca "it was an honest mistake", dar dupa cum si tu stii, ma apuca ~X( atunci cand se intampla la case mai mari :D
Oricum, important este ca omul care a cerut ajutor sa fie lamurit.
0,0p / 0 votes
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.
User avatar
v0id
Word
 
Joined: 05 Jan 2010
Location: 127.0.0.1
Status: 42.5

Re: Delphi & Thread

Postby DarkByte » 19 Sep 2010, 22:53

It doesn't matter, dude :) Ne stim mai bine de-atat. Ma bucur ca ai corectat greseala (chiar daca era a mea :D)

See ya around (hopefully :p) :)
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140


Return to Snippets

Who is online

Users browsing this forum: No registered users and 0 guests

cron