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!