MemoryLeak = CPaintDC + OnEraseBknd
-
Guten Morgen Leute,
angelehnt an einem meiner Threads hier (Wie finde ich MemoryLeak) habe ich nun die Ursache gefunden
(bin nicht der einzige: [https://microsoft.public.windowsce.embedded.vc.narkive.com/WspzB2LG/cpaintdc-memory-leak](Link Adresse))
Hier mal ein Paar Code Schnippsel:
Die OnPaint Method wird durch InvalidateRect zyklisch aufgerufen (50ms-100ms):
void CScanfieldControl::OnPaint() { LockGuard lock(_mutex); CPaintDC dc(this); _layerRoot->Paint(dc); }
was die meine Paint Funtion aufruft.
void LayerRoot::Paint(CDC& dc) { LockGuard lock (_refreshLock); ::BitBlt( dc, BORDER + _renderRect.left, BORDER + _renderRect.top, _renderRect.Width(), _renderRect.Height(), (HDC)_content, 0, 0, SRCCOPY); }
die "_content" is eine DIBBitmap (äquivalent CMemDC) in dem ich mein zeug male... naja egal..
das ganze Funktioniert aber es flackerte. Google meinte ich sollte die OnEraseBknd überscheien und True zurückgeben:
BOOL CScanfieldControl::OnEraseBkgnd(CDC* pDC) { return TRUE; //CWnd::OnEraseBkgnd(pDC); }
dank war das flankern weg. einfwand frei. ABER . nun bekam ich Memory Leak, verursachte durch CPaintDC und OnEraseBknd (TRUE).
Ohne OnEraseBknd (TRUE). waren die leak weg aber flackern da.
Habe CliendDC vresucht, leak weg , kein flackern, aber es wurd nich alles neu gemalt.
So, was meint Ihr? was sollte ich tun, damit das Flackern weg is UND die leaks?:)
Das Flackern is allerding nur auf den WinCE Target, sie sind etwas schwach auf der brust x486 200mb;)
EDIT: interessanter weiße habe ich auch leaks wenn ich einfach nur den Erasebackground Handler benutzut mit :
BOOL CScanfieldControl::OnEraseBkgnd(CDC* pDC) { return CWnd::OnEraseBkgnd(pDC); }
h,mmm??