![]() |
Thread (Memory) wird nicht freigegeben
Hallo Gemeinde,
ich habe hier folgenden Thread:
Delphi-Quellcode:
Bitte jetzt keine Posts, ob der Thread Sinn macht oder nicht.
unit Unit7;
interface uses Classes, SysUtils, Windows; type TTimerThread = class(TThread) private { Private-Deklarationen } protected Line: String; procedure DoAlive; procedure Execute; override; public constructor Create; destructor Destroy; override; end; implementation uses Unit5; constructor TTimerThread.Create; begin inherited Create(false); Priority:= tpHigher; end; destructor TTimerThread.Destroy; begin Priority:= tpNormal; inherited; end; procedure TTimerThread.DoAlive; begin DiagnosticForm.SendAll('Alive;'+TimeToStr(now)); end; procedure TTimerThread.Execute; var MyStart, MyEnd: Double; begin while not Terminated do begin MyStart:= GetTickCount; Sleep(9000); MyEnd:= GetTickCount; while MyEnd - MyStart < 9000 do begin Sleep(10); MyEnd:= GetTickCount; end; DoAlive; end; end; end. Mir geht es um folgendes: Beim Klicken auf den von mir erstellten Beenden-Button wird zuerst die DiagnosticForm beendet, in deren OnCloseQuery-Ereignis aufgerufen wird:
Delphi-Quellcode:
MemCheck sagt mir, dass TTimerThread immer noch Speicher alloziiert.
DisconnectUser;
idTcpServer.Active:= false; ledListening.Brush.Color:= clOff; CaseList.Free; if Assigned(MyTimerThread) then begin MyTimerThread.Terminate; MyTimerThread.WaitFor; MyTimerThread.Free; MyTimerThread:= nil; end; application.processMessages; canClose:= true; Kann mir bitte jemand sagen, wo mein Fehler liegt. Zitat:
Grüße Peter |
Re: Thread (Memory) wird nicht freigegeben
Hi,
ich bin mir ehrlich gesagt nicht 100%ig sicher, aber kann es sein, dass FreeOnTerminate bei dir noch true ist? Denke das war bei Threads standardmässig so. Das führt dazu, dass wenn der Thread beendet wurde, der auch automatisch seine Methode free aufruft. Diese gibt natürlich dann den Speicher einfach frei, was wiederum zu Problemen führen kann. Wenn du hier einfach mal FreeOnTerminate false setzt und es testest (wie gesagt bin mir nicht ganz sicher!). Eine andere Sache ist dann noch, dass es schwer zu sagen ist, wo du ein Memoryleak hast, wenn du nicht zeigst an welchen Stellen der Speicher belegt wird. Du hast ja eine Variable, die eine Instanz dieses TThread speichert. Wenn du aber versehentlich eine Zuweisung vornimmst bevor die aktuelle Instanz frei gegeben wurde, hättest du (wenn FreeOnTerminate false ist) ebenfalls eine Mögliche Quelle für eine Leak. Gruß Der Unwissende |
Re: Thread (Memory) wird nicht freigegeben
Hallo zusammen,
Problem ist gelöst. Ich kann es zwar noch nicht nachvollziehen, aber ich habe nun das MyTimerThread.create etc. und das MyTimerThread.Terminate etc. an anderer Stelle aufgerufen, nun geht's. Muss ich erst mal noch auf mich wirken lassen. Danke und Grüße Peter |
Re: Thread (Memory) wird nicht freigegeben
Ich persönlich würde im Create das FreeOnTerminate = True setzen und dan einfach nur Terminate aufrufen(Als des Free usw. weglassen)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz