Tisk, tisk... Ce ma mai superi DarkByte
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.
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.