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??


Log in to reply