AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TShellTreeView Speicherlecks

Ein Thema von RaSoWa1 · begonnen am 12. Sep 2009 · letzter Beitrag vom 12. Sep 2009
Antwort Antwort
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#1

TShellTreeView Speicherlecks

  Alt 12. Sep 2009, 09:30
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:
destructor TCustomShellTreeView.Destroy;
begin
  if Assigned(FRootFolder)
  then FRootFolder.Free;
  If Assigned(FNotifier)
  then FNotifier.Free;
  inherited Destroy;
end;
2. Der nachfolgende Thread fragt Terminated nicht ab, weil er in WaitForMultipleObjects auf irgendwas ewig wartet. Deshalb habe ich statt INFINITE eine Zeit festgelegt.
Delphi-Quellcode:
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;
FastMM4 findet nach diesen Änderungen keine diesbezüglichen Speicherlecks mehr. Das Programm läuft jetzt auch ohne Fehlermeldungen.
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#2

Re: TShellTreeView Speicherlecks

  Alt 12. Sep 2009, 09:46
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 http://www.mustangpeak.net/ an. Die sind soweit ich das mitbekommen habe um längen tauglicher.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#3

Re: TShellTreeView Speicherlecks

  Alt 12. Sep 2009, 09:54
Noch eine kleine Bemerkung:
Zitat:
Delphi-Quellcode:
if Assigned(FRootFolder)
then FRootFolder.Free;
Free prüft intern bereits auf Assigned, so dass die vorherige Abfrage entfallen kann.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#4

Re: TShellTreeView Speicherlecks

  Alt 12. Sep 2009, 10:18
@DeddyH:
Zitat:
Free prüft intern bereits auf Assigned, so dass die vorherige Abfrage entfallen kann.
Danke. Du hast Recht. Ich habe meinen Code bereis geändert.

@Phoenix:
Zitat:
Schau Dir mal die ShellTools von http://www.mustangpeak.net/ an. Die sind soweit ich das mitbekommen habe um längen tauglicher.
Danke für den Tip. Ich schau sie mir mal.
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.
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: TShellTreeView Speicherlecks

  Alt 12. Sep 2009, 23:26
Hi, die Destroy-Methode gab es bei mir schon und wenigstens FRootFolder wurde schon freigegeben:

Delphi-Quellcode:
destructor TCustomShellTreeView.Destroy;
begin
  ClearItems;
  FRootFolder.Free;
  inherited;
end;
Der Code ist Delphi 2009 Update 3.
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz