Speicherverbrauch eines FrameWnd mit spezieller TreeList-Ansicht

progeny

Grünschnabel
HILFE!

Hallo MFC-"Freunde" :mad:

Ich habe ein ziemlich seltsames Problem. Aus dem Internet habe ich eine kleine Beispielanwendung runtergeladen, die mir zeigt wie ich ein TreeCtrl mit einem ListCtrl verheirate und dieses auch benutze.

Funktioniert alles soweit ganz gut.

Nun das Problem:

Ich benutze meinen (aus dem Netz geladenen) "TreeListCtrlView" als Anzeige. Bin ich mit meiner Maus über der Ansicht (ohne sie zu bewegen) kann ich im Task Manager zusehen, wie die Speichernutzung um ~4kB/s anwächst. Nehme ich (bspw. in einem anderen Frame) eine Standard-MFC-Ansicht, wie z.B. ein ListView laufen zwar die gleichen Messages (lt. Spy++) doch die Speichernutzung bleibt gleich. Habe schon versucht die Callbackfkt. der Windowsmessages zu überladen um zu schauen das nix neu angelegt wird, o.ä., aber irgendwie ohne Erfolg. Der Fehler muss irgendwie tiefer liegen.

Der Fehler ist ohne weiteres Reproduzierbar nur ich bin am Ende.
Vielleicht ist ja mal jemand so nett, compiliert den Kram und schaut ob er den Effekt irgendwie verhindern kann. Weil mein Tool sollte einige Monate am Stück laufen und wenn nach 2 Tagen der Speicherverbrauch irgendwie bei 700MB für einen Prozess ist macht mein Windows das nicht lange mit. Und bitte erspart mir den Tipp halt die Maus halt nicht über der Ansicht zu parken ;)

1000 Dank im Vorraus
 

Anhänge

  • gtreelist.zip
    94,7 KB · Aufrufe: 18
Das grösste Problem behebst du so:

In NewTreeListCtrlView.cpp, in PreTranslateMessage, am Ende der If-Schleife füge den Befehl

ReleaseDC( pDC );

ein. Der DC wird ganz oben mit GetDC erzeugt, aber nicht wieder freigegeben.

Es scheint noch ein kleines Mini-Leck zu geben, aber das konnte ich nicht finden. Es ist vermutlich auch innerhalb dieses Blocks, evtl. der Font (Bin mir nicht sicher, ob der automatisch zerstört wird bzw. vom DC rausselektiert sein muss). Der Fehler tritt auf jeden Fall bei einem MOUSEMOVE auf.
 
Danke dir Das hilft auf jedenfall schon mal weiter! Jedenfalls läufts jetzt nicht mehr über!

Vry well done
Thx :)
 
Hab mir das auch mal angesehen.
Du solltest laut Microsoft, wenn du ein GDI-Objekt selektierst (SelectObject), die Rückgabe speichern.
Und danach das alte Objekt wieder rein selectieren.
z.B.
Code:
CFont* pOldFont = pDc->SelectObject(&font);
...
...
...
pDc->SelectObject(pOldFont);

Gruß Homer
 

Neue Beiträge

Zurück