Finalizarea corectă a fluxurilor - depășirea stivei în limba rusă

Există o clasă de thread:

Și trei copii ale acestora sunt declarate în secțiunea publică a variabilelor formularului:

Rularea firului merge astfel:

La evenimentul Close al formularului am introdus următorul cod:







El face o eroare de memorie. Încerca să închidă acest fel cu formularul:

Încercat să se înregistreze în cazul distrugerii evenimentului:

Dar asta nu ajută în niciun fel. Erori persistă, deoarece fluxul (fluxurile) este închis incorect. Cum să învinge această greșeală? Imediat spun că fluxul continuă să funcționeze cu baza de date, furnizând date către formular (contoare și descărcări de progres).

presetate 14 august 15 la 14:56

Vă mulțumim pentru răspunsul foarte util! Și totuși, judecând după codul care a fost dat în legătură, nu există încă nicio ADOConnecție în clasa thread-ului, se încarcă date externe din conectorul existent. Singura diferență față de versiunea mea este că tabelul din codul de acolo creează o tabelă internă și este folosit pentru a conecta componenta conector. În rest, am făcut și eu. - IntegralAL pe data de 15 august '15 la ora 4:08







Nu utilizați Reluare. Această metodă, pornind din punctul meu de vedere cu XE, este suprimată (respinsă). Reluați Reluarea utilizând Start. Dar numai dacă firul este creat de Suspendat, adică un constructor supraîncărcat este apelat cu parametrul CreateSuspended: = true

Nu este necesar să opriți forța fișa deja pornită. Acest lucru va duce la scurgeri de memorie. Fluxul poate fi afectat. de exemplu, să-l informați că vreți să-l întrerupeți. Fișierul se va termina când se va executa ultima instrucțiune din blocul Execute sau valoarea Terminat va fi setată la True (Nu considerăm cazuri de scoatere din priză sau de dezactivare a microdistrictului).

Opțiuni de NewThread.Free. NewThread = zero nu va aduce un rezultat bun. Astfel de metode pot opri forța firului și pot cauza blocări de resurse sau scurgeri de memorie.

Pentru ca firul să se termine corect, trebuie să faceți următoarele:

  • Așteptați până la sfârșitul execuției sale (trivial, dar este)
  • Spuneți firului că îi cereți să se încheie

A doua modalitate pe care o voi descrie în detaliu: Aceasta este o metodă de cooperare pentru lucrul cu firele principale și copil. Trebuie să apelați metoda fluxului Terminare. Și în Execute, programați verificarea proprietății Terminate. După aceasta, Execute va verifica periodic prezența proprietății Termnated instalată și atunci când apare, firul se va opri și dacă FreeOnTerminate: = true true va elibera toate resursele (șterge obiecte, eliberează încuietori etc.)

răspuns dat dat 14 Aug 15 la 15:44







Articole similare

Trimiteți-le prietenilor: