Sincronizați în Delphi

Dacă utilizați mai multe fire în cerere este necesar să se asigure că în acest moment doar un singur fir poate avea acces la proprietățile și metodele VCL obiect - componentă vizuală Delphi, și anume acțiunea fluxului pe care doriți să le sincronizați unul cu celălalt. Pentru a efectua o astfel de sincronizare în Delphi, se utilizează o metodă specială numită Sincronizare. în care trebuie să apelați proceduri care modifică proprietățile componentelor vizuale.

Procedura Sincronizare utilizează ca parametru acele proceduri în care proprietățile componentelor vizuale sunt modificate și blochează accesul simultan la componenta mai multor fire. Iată un exemplu, în special, conținut în modulul generat de Expertul pentru crearea de fluxuri:

procedura MyThread.Execute;
începe
Sincronizați (UpdateCaption);
se încheie;

În acest caz, fluxul este utilizat pentru a schimba antetul Formularului. Schimbarea antetului se produce în procedura UpdateCaption. Se pare că pentru a schimba antetul, este suficient să numiți această procedură în procedura principală a firului, Execute. Cu toate acestea, dacă mai multe astfel de fire în program încearcă simultan să schimbe antetul Formularului, acest lucru poate duce la consecințe imprevizibile. Pentru a exclude acest lucru, procedura de UpdateCaption este apelată în procedura Execute ca parametru al metodei Sincronizare.

Trebuie să știți că metoda Synchronize rulează în firul principal al aplicației. Prin urmare, atunci când lucrați cu mai multe fire într-o aplicație și utilizând metoda de sincronizare, trebuie să aveți în vedere următoarele:
  • În primul rând, un apel frecvent la Sincronizare încetinește executarea aplicației;
  • În al doilea rând, dacă aproape toate procedurile din firul de execuție sunt efectuate utilizând metoda sincronizării, atunci nu are sens să creați un astfel de fir - acesta va funcționa în continuare în firul principal.
De exemplu, luați în considerare aceeași modificare a antetului Formular. Lăsați unul dintre fire să funcționeze cu o gamă largă și doriți să afișați cât de mult din matrice este deja procesată. Pentru a face acest lucru, vom organiza un fir care va efectua această lucrare. Vom scoate indexul elementului cu care firul de procesare rulează în prezent în antetul Formular. Vom face acest lucru cu o frecvență de 10 ori pe secundă. Mai întâi vom face acest lucru:

procedura TMyThread.UpdateCaption;
începe
în timp ce True
începe
Form1.Capție: = IntToStr (I); // I - variabila globala a programului principal, indice matrice
somn (100);
se încheie;
se încheie;

procedura TMyThread.Execute;
începe
Sincronizați (UpdateCaption);
se încheie;

Vedem că exact ceea ce este scris mai sus se întâmplă. Întrucât tot codul de flux și modificarea antetului Formular și a buclă de așteptare sunt efectuate în metoda de sincronizare. și, prin urmare, în firul principal, atunci aplicația va arăta și va fi chiar imposibil de completat corect.
Acum încercați să ieșiți din sincronizare:

procedura TMyThread.UpdateCaption;
începe
Form1.Capțiune: = IntToStr (Cap);
se încheie;

Aceasta este opțiunea corectă. Cu metoda de sincronizare, este efectuată numai o modificare directă a antetului de formular, iar bucla de așteptare este executată în fir și nu interferează cu firul principal.

Unele obiecte VCL nu necesită procedura de sincronizare, deoarece sunt încă capabile să funcționeze corect cu fire sau au nevoie de alte metode de sincronizare. Deci, lucrați corect cu fire
  • componente de acces la baze de date (utilizând componente de clasă TSession). Excepția este bazele de date Microsoft Access;
  • clase care lucrează direct cu grafica. Acesta TFont, tpen, TBrush, TBitmap, TMetafile și Ticon. Conturarea obiectelor acestor clase (Canvas) pot fi folosite fără aplicarea metodei Synchronize. Aceasta se face prin blocarea pânzei. Adică, firul este prezent, folosind panza, panza de pre-bloc de blocare, împiedicând alte fire pentru a lucra cu panza, apoi deblocați de Unlock.
Pe lângă componentele vizuale, ei nu știu cum să lucreze cu listele TList. Prin urmare, în fluxuri, ar trebui să utilizați obiecte TThreadList care au metode de blocare și deblocare LockList și UnLockList.





Articole similare

Trimiteți-le prietenilor: