distrugere simplă curgere, programare în Delfi - web, mysql

problemă completă, oprire și distrugerea firelor.

În capitolul 2, a fost menționat de mai multe probleme cu finalizarea fluxului, cele mai importante sunt:

  • Resurse de eliberare a fluxului care ies ocupate.
  • Obținerea de rezultate din fluxul de la finalizarea acestuia.

Aceste subiecte sunt strâns legate. În cazul în care fluxul nu este necesară pentru a transmite oricare dintre informațiile din fluxul principal de VCL, atunci când este completă, sau dacă utilizați metodele descrise în secțiunea anterioară (rezultate de transfer direct în fața stației de curgere), atunci nu este nevoie să se angajeze în masă VCL fluxul de curățare generat. În aceste cazuri, puteți seta la fluxul FreeOnTerminate adevărat și pentru a permite fluxul să execute eliberarea de memorie proprie în sine. Doar amintiți-vă că, în acest caz, utilizatorul poate părăsi programul în orice moment, astfel încât toate fluxurile vor fi finalizate, iar probabilitatea de consecințe nedorite. Dacă fluxul scrie doar ceva în memoria sau asociată cu alte părți ale cererii, aceasta nu este o problemă. Dacă el scrie date într-un fișier sau rularea unui sistem de resurse partajate, atunci această metodă este inacceptabilă.

În cazul în care fluxul ar trebui să facă schimb de informații cu VCL după finalizarea, este necesar să se prevadă un mecanism de sincronizare cu principalul flux VCL firul muncitor și firul principal va trebui să fie curățate VCL (trebuie să scrie cod de presă flux). Două mecanisme pentru aceasta sunt descrise mai jos.

Trebuie amintit un lucru:

  • opritorul de debit până la final naturală.

Acest lucru se întâmplă destul de des. Unele fluxuri, în special cele care se ocupă de intrare-ieșire, conțin executarea unei bucle infinite: programul poate obține întotdeauna noi date, iar debitul trebuie să fie gata pentru primirea și procesarea acestora, atâta timp cât programul se execută.
Deci, ia în considerare aceste întrebări în ordine inversă ...

fluxul de oprire prematură.

În unele situații, un fir poate fi obligat să notifice celeilalte firul cu privire la finalizarea acestuia. Acest lucru se întâmplă de obicei atunci când firul se execută o operație de lungă durată, iar utilizatorul decide să renunțe la cererea sau operațiune trebuie să fie întreruptă. TThread oferă un mecanism simplu pentru a sprijini o astfel de acțiune, și anume metoda și proprietatea Terminated Terminate. Atunci când se creează un fir, proprietatea Terminată este setată la False, și ori de câte ori numita metodă Terminate, proprietatea Terminată pentru acest flux este setat la True. Astfel, toate fluxurile sunt responsabili pentru verificarea periodică dacă acestea nu au încetat, iar dacă se întâmplă, pentru completarea corectă a lucrării. Rețineți că nu există nici o sincronizare la scară largă, astfel, nu se produce atunci când unul seturi de fire TERMINATED proprietatea altuia, nu putem presupune că celălalt fir, apoi citește valoarea proprietăților sale de conectorizare și începe procesul de completare. proprietate Încheiată este doar un steag, spune „Vă rugăm să se încheie cât mai curând posibil.“

Atunci când fluxul necesar de obiecte de proiectare să acorde o atenție pentru a verifica proprietățile Terminată, în cazul în care poate fi necesară. În cazul în care firul este blocat, ca urmare a oricăreia dintre mecanismele de sincronizare, discutate mai jos, puteți suprascrie metoda Terminate pentru ao debloca. Nu uitați că trebuie să apelați metoda moștenită Terminate înainte de deblocarea firului, dacă doriți să verificați următoarele TERMINATED returnat Adevărat. Aici este un exemplu - o ușoară modificare:

flux grunduiește calcul din secțiunea anterioară cu adăugarea de verificare a proprietăților Terminată. Eu cred că este acceptabil, în cazul în care fluxul va returna un rezultat incorect în cazul în care proprietatea Terminată stabilită.

eveniment OnTerminate apare atunci când fluxul de fapt finalizat. Aceasta nu se întâmplă atunci când apelați Terminate metoda de curgere. Acest eveniment poate fi foarte util, deoarece aceasta rulează în contextul VCL debitului principal, metode similare folosind numit Synchronize. Astfel, dacă doriți să efectuați o acțiune cu firul VCL, care este eliberat în mod automat la sfârșitul anului, de tratare a acestui eveniment - locul perfect pentru o astfel de acțiune. Pentru cei mai mulți programatori, incepatori pentru a lucra cu fluxuri, acesta este cel mai convenabil mod de a prelua date de la un non-VCL fluxul de efort, nu necesită apeluri de sincronizare explicite.

OnTerminate funcționează în esență același mod ca și Sincronizați, iar apelul Sincronizați aproape identic semantically la sfârșitul fluxului. Principalul avantaj al unei astfel de situații este că, prin utilizarea unui steag, de exemplu, «AppCanQuit» de lucru sau contra fluxurilor în VCL de flux principal poate oferi mecanisme de verificare simple, care VCL fluxul principal este finalizată numai atunci când toate celelalte fire sunt oprite. Există unele subtilități de sincronizare, mai ales în cazul în care programatorul ar trebui să efectueze un apel la eveniment flux Application.Terminate OnTerminate, dar aceste probleme vor fi discutate mai târziu.

Controlată de oprire a fluxului - Abordarea 1.

În acest exemplu, vom folosi codul pentru amorse în capitolele 3 și modificați-l astfel încât un utilizator nu poate închide accidental aplicația, atunci când un fir lucrător. Este destul de simplu. De fapt, nu avem nevoie de a modifica fluxul de cod. Tocmai am adăuga un câmp număr de referință la forma principală, creșterea acesteia la crearea fluxurilor, de a crea un eveniment OnTerminate, ceea ce va reduce numărul de referință, iar atunci când utilizatorul încearcă să închidă programul, vom arăta, dacă este necesar, o casetă de dialog de avertizare.

Aceasta arată cât de ușor pentru a realiza acest lucru: toate codul legate de urmărirea numărului de fire este executat în firul principal VCL, iar acest cod este condus de un eveniment, așa cum se face de obicei în Delphi-aplicații. În secțiunea următoare vom lua în considerare o abordare mai sofisticată, care are unele avantaje în utilizarea unor mecanisme avansate de sincronizare.

A se vedea, de asemenea: