Clasa a treia - capitolul 29

Delphi prezintă programatorului cu acces complet la capacitățile de programare ale interfeței Win32. De ce, atunci, Borland a introdus o clasă specială pentru organizarea fluxurilor? În general, un programator nu trebuie să înțeleagă toate complicațiile mecanismelor oferite de sistemul de operare. Clasa ar trebui să încapsuleze și să simplifice interfața programului; clasa TThread este un exemplu excelent de a oferi dezvoltatorului acces ușor la firele de programare. API-ul firului în sine, în general, nu este foarte complicat, dar caracteristicile oferite de clasa TThread sunt, în general, remarcabil de simple. Pe scurt, tot ce trebuie să faceți este să înlocuiți metoda virtuală Execute.







O altă caracteristică distinctivă a clasei TThread este garanția muncii sigure cu biblioteca componentelor vizuale VCL. Fără utilizarea clasei TThread în timpul apelurilor VCL, pot apărea situații care necesită o sincronizare specială (consultați "Probleme la sincronizarea firelor" mai târziu în acest capitol).

Trebuie să ne dăm seama că, din punctul de vedere al sistemului de operare, firul este obiectul acestuia. Când este creat, devine mânerul și este urmărit de sistemul de operare. Un obiect de clasă TThread este un construct Delphi corespunzător filetului OS. Acest obiect VCL este creat înainte ca un flux real să apară în sistem și este distrus după ce dispare.

Începem studiul clasei TThread cu metoda Execute:

procedura Execute; virtuale; abstract;

Acesta este codul executat în firul TThread pe care îl creați.

Deși descrierea formală a Execute este o metodă abstractă, expertul Creați un nou obiect TThread creează un șablon gol pentru această metodă pentru dvs.

Prin suprimarea metodei Execute, putem introduce în clasa de thread nou ce va fi executat atunci când este rulat. În cazul în care fluxul a fost creat cu un argument CreateSuspended, egal cu False, metoda Execute este executată imediat, în caz contrar, apelul se efectuează după metoda Execute CV-ul (a se vedea. Descriere Designer de mai jos).

Dacă firul este proiectat pentru o singură execuție a oricărei acțiuni, atunci nu este nevoie să scrieți niciun cod de ieșire special în Execute.

Dacă un fir execută un ciclu și firul trebuie să se termine cu aplicația, atunci condițiile de sfârșit pentru buclă ar trebui să fie ceva de genul:

Până la CancelCondition sau Terminat;

Acolo CancelCondition - personal sfârșitul dvs. flux condiție (.. Epuizarea datelor, fluxul de calcul se încheie la intrarea unui caracter, etc.) și proprietatea Încheiată informează finalizarea flux (această proprietate poate fi găsit atât în ​​interiorul cât și filet exterior; cel mai probabil, procesul care la generat este în curs de finalizare).

constructor Creare (CreateSuspended: Boolean);

obține parametrul CreateSuspended. Dacă valoarea sa este True, firul nou creat nu pornește până când nu este apelată metoda Reluare. În cazul în care parametrul CreateSuspended este setat la False, constructorul este terminat și numai atunci firul începe executarea.

destructor Destroy; suprascrie;

Distrugătorul Destroy este chemat când nu este nevoie de firul creat. Distructorul îl completează și eliberează toate resursele asociate obiectului TThread. funcția Terminate: Integer;

Pentru a finaliza fluxul (fără lansarea ulterioară), există o metodă Terminate. Dar dacă credeți că această metodă face anumite acțiuni forțate pentru a opri curgerea, vă înșelați. Tot ce se întâmplă este setarea proprietății







proprietate Terminat: boolean;

în valoarea True. Astfel, terminarea este indicația unui fir de încheiere, exprimat în "formă moale", cu posibilitatea de a elibera corect resursele. Dacă trebuie să terminați imediat fluxul, utilizați funcția Windows TerminateThread API.

Metoda Terminate este, de asemenea, apelată automat de la destructorul obiectului. Obiectul thread-VCL va aștepta până când fișierul obiect al sistemului de operare va fi terminat. Astfel, dacă firul nu știe cum să se termine corect, apelarea unui destructor poate provoca întreruperea întregului program.

O altă caracteristică utilă:

proprietate FreeOnTerminate: Boolean;

Dacă această proprietate este adevărată, destructorul firului va fi sunat automat după terminarea acestuia. Acest lucru este foarte util pentru acele cazuri când nu sunteți sigur în programul dvs. exact când firul se va termina și doriți să-l utilizați pe principiul "foc și uitați".

funcție WaitFor: Integer;

Metoda WaitFor este proiectată pentru sincronizare și permite unui fir de execuție să aștepte până când un alt fir de execuție se termină. Dacă vă aflați în firul FirstThread, scrieți codul

atunci aceasta înseamnă că fluxul FirstThread este oprit până când se termină firul SecondThread. Metoda WaitFor returnează codul de ieșire al firului așteptat (a se vedea proprietatea Returnvalue).

proprietate Mâner: THandle citit FHandle;

proprietate ThreadID: THandle citit FThreadID;

Proprietățile Handle și ThreadID oferă programatorului acces direct la fir folosind API-ul Win32. Dacă dezvoltatorul dorește să acceseze fluxul și să îl gestioneze, ocolind capabilitățile clasei TThread, valorile Handle și ThreadID pot fi folosite ca argumente pentru funcțiile API Win32. De exemplu, dacă un programator dorește să aștepte mai multe fire de execuție înainte de a continua executarea aplicației, trebuie să apeleze funcția API waitForMuitipieObjects; o serie de descriptori de fire este necesară pentru a o apela.

proprietate Prioritate: TThreadPrioritate;

Proprietatea Priority vă permite să interogați și să prioritizați firele. Prioritățile fluxurilor sunt descrise în detaliu mai sus. Valorile valide pentru obiectele prioritare TThread sunt tpidle, tpLowest, tpLower, tpNormai, tpHigher, tpHighest și tpTimeCritical.

sincronizați procedura (metoda: TThreadMethod);

Această metodă se referă la secțiunea protejată, adică poate fi apelată numai de la descendenții TThread. Delphi furnizează programatorului metoda Synchronize for

asigurați apelul securizat al metodelor VCL în fire. Pentru a evita conflictele, metoda de sincronizare garantează că fiecare obiect VCL are un singur fir la un moment dat. Argumentul transmis la metoda de sincronizare este numele metodei care invocă VCL; Apelul la Sincronizare cu acest parametru este același ca și apelarea metodei în sine. Această metodă (din clasa TThreadMethod) nu ar trebui să aibă parametri și nu ar trebui să returneze nici o valoare. De exemplu, în forma principală a aplicației, trebuie să oferiți o funcție

procedura TMainForm.SyncShowMessage; începe

ShowMessagedntToStr (Conținutul listei de fișiere)); // alte apeluri către VCL

și în flux pentru a afișa mesajul, nu scrieți

Când efectuați orice apel la un obiect VCL dintr-un fir, asigurați-vă că este utilizat metoda de sincronizare; altfel rezultatele pot fi imprevizibile. Acest lucru este valabil chiar dacă utilizați instrumentele de sincronizare descrise mai jos.

Reluare TThread metodă de clasă este invocată atunci când firul de execuție se reia după o oprire, sau pentru a începe în mod explicit fluxul creat cu parametrul CreateSuspended, egal cu adevărat.

Apelarea metodei Suspend suspendă firul cu posibilitatea de a reporni ulterior. Metoda de suspendare suspendă fluxul, indiferent de codul care execută în prezent; execuția continuă de la punctul de întrerupere.

proprietate Suspendat: Boolean;

Proprietatea suspendată permite programatorului să determine dacă firul este suspendat. Cu această proprietate, puteți porni și opri și un fir. Prin setarea proprietății suspendate la True, obțineți același rezultat ca atunci când apelați metoda Suspend-Suspend. În schimb, setarea proprietății Suspendate la False reia executarea firelor, cum ar fi apelarea metodei Reluare.

proprietate ReturnValue: Integer;

Proprietatea ReturnValue vă permite să aflați și să setați valoarea returnată de fir atunci când acesta se termină. Această valoare este complet determinată de utilizator. În mod implicit, fluxul revine la zero, dar dacă programatorul dorește să returneze o altă valoare, atunci reinstalarea proprietății ReturnValue din interiorul fluxului va primi această informație din alte fire. Aceasta, de exemplu, poate fi utilă dacă există probleme în interiorul firului sau dacă folosiți proprietatea ReturnValue pentru a returna numărul de cuvinte care nu au fost verificate cu ortografie.

Aceasta conchide o prezentare detaliată a clasei TThread. Pentru o cunoaștere mai strânsă cu firele și clasa Delphi TThread vom crea o aplicație cu mai multe fire. Pentru a face acest lucru, scrieți doar câteva linii de cod și faceți clic pe mouse de mai multe ori.








Articole similare

Trimiteți-le prietenilor: