![]() |
TShellTreeView Speicherlecks
Hallo,
Bei der Suche nach Speicherlecks in einem gößeren Programm, habe ich festgestellt, das diese z.T. von der TShellTreeView-Komponente stammten. Ich habe in der ShellCtrls.pas folgende Änderungen vorgenommen: 1. eine Destroy-Methode in TCustomShellTreeView eingefügt und FRootFolder und FNotifier freigegeben.
Delphi-Quellcode:
2. Der nachfolgende Thread fragt Terminated nicht ab, weil er in WaitForMultipleObjects auf irgendwas ewig wartet. Deshalb habe ich statt INFINITE eine Zeit festgelegt.
destructor TCustomShellTreeView.Destroy;
begin if Assigned(FRootFolder) then FRootFolder.Free; If Assigned(FNotifier) then FNotifier.Free; inherited Destroy; end;
Delphi-Quellcode:
FastMM4 findet nach diesen Änderungen keine diesbezüglichen Speicherlecks mehr. Das Programm läuft jetzt auch ohne Fehlermeldungen.
procedure TShellChangeThread.Execute;
var Obj: DWORD; Handles: array[0..1] of DWORD; begin EnterCriticalSection(CS); FWaitHandle := FindFirstChangeNotification(PChar(FDirectory), LongBool(FWatchSubTree), FNotifyOptionFlags); LeaveCriticalSection(CS); if FWaitHandle = ERROR_INVALID_HANDLE then Exit; while not Terminated do begin Handles[0] := FWaitHandle; Handles[1] := FMutex; // Obj := WaitForMultipleObjects(2, @Handles, False, INFINITE); Obj := WaitForMultipleObjects(2, @Handles, False, 500); // neue Zeile von RaSoWa case Obj of WAIT_OBJECT_0: begin Synchronize(FChangeEvent); FindNextChangeNotification(FWaitHandle); end; WAIT_OBJECT_0 + 1: ReleaseMutex(FMutex); WAIT_FAILED: Exit; end; EnterCriticalSection(CS); if FWaitChanged then begin FWaitHandle := FindFirstChangeNotification(PChar(FDirectory), LongBool(FWatchSubTree), FNotifyOptionFlags); FWaitChanged := false; end; LeaveCriticalSection(CS); end; end; Da diese API-Programmierung nicht gerade meine Stärte ist, habe ich folgende Fragen: Worauf wartet der Thread in WaitForMultipleObjects? Welche Nebenwirkungen können auftreten, wenn ich, wie oben angegeben, die Wartezeit begrenze? Vielleicht kann jemand meine Fragen beantworten. Vielen Dank im Vorraus. Klaus |
Re: TShellTreeView Speicherlecks
Die ShellTreeView komponenten sind nicht nur mit Speicherlecks durchzogen sondern auch noch so richtig Buggy. Ab und an kann es passieren, dass eine Anwendung bei der Verwendung dieser Komponenten ins Nirvana wegploppt (ganz seltsamer Fehler, den wir von Delphi-Anwendungen eigentlich nur seltenst kennen. *Plopp*, Fenster & Prozess weg. Ohne Fehlermeldung oder sonstiges).
Es sind halt nur Demos und keine 'richtigen' Komponenten. Leider merkt man das sehr stark, wenn man sich auf die Dinger verlässt. Schau Dir mal die ShellTools von ![]() |
Re: TShellTreeView Speicherlecks
Noch eine kleine Bemerkung:
Zitat:
|
Re: TShellTreeView Speicherlecks
@DeddyH:
Zitat:
@Phoenix: Zitat:
Mit der TShellTreeView-Komponente hatte ich bisher noch keine direkten Probleme. Allerdings kann sie durch die jetzt bemerkten Speicherlecks Ursache für andere eigenartige Probleme gewesen sein. |
Re: TShellTreeView Speicherlecks
Hi, die Destroy-Methode gab es bei mir schon und wenigstens FRootFolder wurde schon freigegeben:
Delphi-Quellcode:
Der Code ist Delphi 2009 Update 3.
destructor TCustomShellTreeView.Destroy;
begin ClearItems; FRootFolder.Free; inherited; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 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 by Thomas Breitkreuz