Memória szivárgás menettel

Memória szivárgás menettel


# XA0; TMyThread = osztály (TThread)
# XA0; magán-

# XA0; védett
# XA0; # XA0; eljárás végrehajtása; felülbírálhatja;
# XA0, köz-

eljárás TMyThread.Execute;
kezdődik
# XA0; FreeOnTerminate: = true;
végén;

eljárás TForm1.Button1Click (Sender: TObject);
kezdődik
# XA0; TMyThread.Create (hamis) .Terminate;
végén;

Ebben az esetben a destruktor nem fog működni, valamint Execute. Csak van olyan helyzet, amikor bizonyos körülmények között az áramlási futhat percig, majd a patak működhet nagyon gyorsan, és végrehajtás nem sikerül végrehajtani a többi bemenet.
Annak érdekében, hogy leküzdjék a eltérítése I blokkolt AfterConstruction és ennek az eljárásnak még hozzáadunk Sleep string (300).
Van valaki találkozott hasonló. Hogyan kell küzdeni?

FreeOnTerminate: = true; annyit kell tennie, hogy felmondja;


> Destructor nem fog működni


> Csakúgy, mint Execute

És végre működni fog.


> Memóriaszivárgás ha dolgozik szálak

Nem nincs szivárgás.

Mi az áramlás? Sozdavaymy? Kiderült, hogy az Execute még végre ismét „stream működhet”?


> Működhet nagyon gyorsan, # XA0; Végrehajtás, és nem volt ideje, hogy végre kell hajtani

nincs idő fut - ez olyan, mint? Nincs ideje, hogy önkéntes? És amit valóban létre, ha nem végez # XA0; Execute?
Zchem ez a „példa”: # XA0; TMyThread.Create (hamis) .Terminate;

Állítsa FreeOnTerminate igaz, ha nem akarja, hogy kifejezetten tönkre menetek után befejezi végrehajtó.
és # XA0; TMyThread.Create (hamis) .Terminate; nem bánod csinálni kifejezetten.

Szivárgás akkor mi van? Az a tény, hogy ő ölte meg, mielőtt ő hajthat végre Execute?

Általában mindig az volt a benyomásom, hogy az áramlás Execute kezdődik még befejezése előtt a kivitelező tárgya Delphi, ha fel van tüntetve TMyThread.Create (hamis)

Nem feltétlenül, de lehetséges. Minden attól függ, hogy a rendszer hogyan szál ütemező osztja időrés között az áramlás és az áramlási okozott a kivitelező, hogy jön létre ebben a kivitelező.

Fejezze beállítja a szál „s Lezárt tulajdonságot True. Ha megvalósította az Execute eljárás megfelelő, akkor ellenőrzi a Lezárt ingatlan rendszeresen, és megáll futtatását Lezárt True.

és megszüntetése # XA0, ez nem unchtozhenie szál és zászló a jelölést, amelyet kezelni kell a végrehajtás. úgyhogy a végrehajtás nem megy sehova.

Legalább ellenőrizze a kódot.

Mi ellenőrizze?

Nem nincs szivárgás, és nem lehet, és a destruktor munkatevékenységre ki bírságot, mert nem volt előfeltétele.

Azt tesztelték a kód [0]? Nem? De én tesztelt. A FastMM4. Ez egy menedzser nem fog hazudni.

Aha. És ez a „menedzser” Ahogy mondtam néked, mondván elvégzése és elpusztítani módszerek nem nevezett, így ott. Vagy ez otsebyachena alapuló spekuláció helyett tényeket?

> Vagy ez otsebyachena alapuló spekuláció helyett tényeket
>?

Ez a „otsebyachena” alapozni. Ellenőrizze magát a végén.


destructor TMyThread.Destroy;
kezdődik
# XA0; örökölt;
# XA0; Windows.Beep (500, 100);
végén;

Hogy milyen bizonyíték, akkor. Pontosabban?


> Ha hallja zvuchek

Mi egy óvoda „invázió hangok”?

Te beszélsz a beépített debugger Delphi hallott # XA0;?

funkció ThreadProc (Szál: TThread): egész;
var
# XA0; FreeThread: Boolean;
kezdődik

# XA0; ha Thread.FSuspended majd sem_wait (Thread.FCreateSuspendedSem);

# XA0, próbálja
# XA0; # XA0, ha nem, akkor Thread.Terminated
# XA0; # XA0, próbálja

mivel a téma már, ha megteremti a Lezárt, akkor a végrehajtás, persze, nem teljesül

# XA0; # XA0; # XA0; Thread.Execute;
# XA0; # XA0, kivéve
# XA0; # XA0; # XA0; Thread.FFatalException: = AcquireExceptionObject;
# XA0; # XA0; end;
# XA0, végül
# XA0; # XA0; FreeThread: = Thread.FFreeOnTerminate;
# XA0; # XA0; Eredmény: = Thread.FReturnValue;
# XA0; # XA0; Thread.DoTerminate;
# XA0; # XA0; Thread.FFinished: = True;
# XA0; # XA0; SignalSyncEvent;
# XA0; # XA0, ha FreeThread majd Thread.Free;

# XA0; mivel FreeOnTerminate = false (Ehesute nem nevezett), a # XA0;
# XA0; Thread.Free nem hívott


# XA0; # XA0; EndThread (Eredmény);


# XA0; # XA0; // közvetlen felhívása pthread_exit óta EndThread leválnak a menet okozó
# XA0; # XA0; // a pthread_join a TThread.WaitFor nem. # XA0; Is, győződjön meg róla, a EndThreadProc
# XA0; # XA0; // hívják, mint EndThread tenne. EndThreadProc ne térjen
# XA0; # XA0; // és hívás pthread_exit magát.
# XA0; # XA0; ha hozzárendelt (EndThreadProc), majd
# XA0; # XA0; # XA0; EndThreadProc (Eredmény);
# XA0; # XA0; pthread_exit (Pointer (Eredmény));

# XA0; end;
végén;

De mentem és díszlettervező a hívó szál prioritása a legalacsonyabb - és a sort, ha nem, akkor nem Thread.Terminated Thread.Terminated állapotban könnyen lehet igaz.

> Vagy ustoanovi azt True megszüntetésére.

Lehetőség van, és ebben a kiviteli alakban. Hazajövök - potestit.

Azt tesztelték a kód [0]? Nem? De én tesztelt. A FastMM4. Ez egy menedzser nem fog hazudni.

És anélkül, hogy FastMM4 láthatjuk, hogy minden egyes megnyomásakor a Button1 „sodaetsya” egy leíró.

Te beszélsz a beépített debugger Delphi hallott # XA0;?
Under hibakereső (D7) és átmentem a kódot [18], és megállapította az oka a szivárgás - a rossz főzési macskák.

Igen. Bevallom én hibám :(
Csak meg kell gazdálkodni az összes sor FreeOnTerminate: = true; tolta a végrehajtás, és itt azt hittem, jobb. De nem. Milyen kár!

Kapcsolódó cikkek