Memory-Leak? Handle nicht freigegeben?



  • SeboStone schrieb:

    Toll! Und was sagt die Exeption? Meine Kristallkugel ist noch in der Reparatur.

    Den genauen Text kann ich dir am Montag, wenn ich wieder bei der Arbeit bin, posten.

    Der Fehler ist so oder so, dass sich kein Bitmap-Handel mehr erzeugen lässt.



  • geeky schrieb:

    öh was tust du da überhaupt?
    Sicher das du das nicht einfacher haben kannst durch:

    this.SetStyle(ControlStyles.AllPaintingInWmPaint);
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer);
    

    Wenn das vom Compact Framework 2.0 unterstützt wird, werde ich es ausprobieren.

    geeky schrieb:

    (...und warum coredll.dll?)

    Weil es Windows Mobile ist.



  • Oh Sorry, hab das CF überlesen 😉



  • Müsste das hier nicht etwa dasselbe sein:

    protected override void OnPaint(PaintEventArgs e)
    {
    	base.OnPaint(e);
    
    	Bitmap bmpBuffer=new Bitmap(ClientSize.Width, ClientSize.Height);
    
    	Graphics grBuffer = Graphics.FromImage(bmpBuffer);
    	grBuffer.FillRectangle(new SolidBrush(BackColor), ClientRectangle);
    
    	//
    	// ...
    	//                      
    
    	e.Graphics.DrawImage(bmpBuffer, 0, 0, ClientRectangle, GraphicsUnit.Pixel)
    
    	bmpBuffer.Dispose();
    }
    

    ...den bmpBuffer kann man dabei noch aus der Funktion rausnehmen und bei OnCreate() oder so erzeugen und bei OnResize() löschen und neu erzeugen und spart damit dann nochmal Zeit (außer beim resizen)



  • Jo, sieht auf den ersten Blick sehr erfolgsversprechend aus.

    Ich werde es am Montag ausprobieren und das Ergebnis hier posten.

    Danke!



  • Hat alles bestens funktioniert!



  • Blutiger Anfänger schrieb:

    protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                            
                IntPtr hdcOnScreen = e.Graphics.GetHdc();
                Bitmap bmpBuffer = Bitmap.FromHbitmap(Sonstiges.DllImport.CreateCompatibleBitmap(hdcOnScreen, ClientSize.Width, ClientSize.Height));
                IntPtr hBuffer = bmpBuffer.GetHbitmap();
                Graphics grBuffer = Graphics.FromImage(bmpBuffer);
                grBuffer.FillRectangle(new SolidBrush(BackColor), ClientRectangle);
     
                //
                // ...
                //                       
    
                IntPtr hdcOffScreen = grBuffer.GetHdc();
                Sonstiges.DllImport.BitBlt(hdcOnScreen, 0, 0, ClientSize.Width, ClientSize.Height, hdcOffScreen, 0, 0, SRCCOPY);
                Sonstiges.DllImport.DeleteObject(hBuffer);
                grBuffer.ReleaseHdc(hdcOffScreen);
                e.Graphics.ReleaseHdc(hdcOnScreen);
                Sonstiges.DllImport.DeleteDC(hdcOffScreen);
                Sonstiges.DllImport.DeleteDC(hdcOnScreen); 
            }
    

    Hier ist der Code mit dem ich die DLL-Funktionen importiere:

    [DllImport("coredll.dll")]
            public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
    
            [DllImport("coredll.dll")]
            public static extern bool DeleteDC(IntPtr hDC);
    
            [DllImport("coredll.dll")]
            public static extern bool DeleteObject(IntPtr hObject);
    

    Wenn du noch wissen möchtest wieso du ein Memory Leak hast:

    Bitmap's sind externe Ressourcen -> Der Garbage Collector löscht die Bitmap die du erstellst nicht automatisch. Wenn du nun die Bitmap immer wieder erstellst wenn du malst häuft sich was an... Deswegen musst du den Bitmap.Dispose() aufrufen um den Speicher freizugeben.

    Hoffe ich konnte helfen 🙂



  • Benutze die C# using Directive um Dispose Exception- Safe und auf einen Scope bezogen aufzurufen.



  • Hallo Helfer,

    danke für deine Antwort.

    HElfer schrieb:

    Wenn du noch wissen möchtest wieso du ein Memory Leak hast:

    Bitmap's sind externe Ressourcen -> Der Garbage Collector löscht die Bitmap die du erstellst nicht automatisch. Wenn du nun die Bitmap immer wieder erstellst wenn du malst häuft sich was an... Deswegen musst du den Bitmap.Dispose() aufrufen um den Speicher freizugeben.

    Hoffe ich konnte helfen 🙂

    Gibt dieses hier nicht das Bitmap frei? Zumindest dafür hatte ich es gedacht.

    Sonstiges.DllImport.DeleteObject(hBuffer);



  • Ehrlich gesagt weiß ich es nicht, aber wenn die Bitmap schon ein Dispose() anbietet sollte man auch dies benutzen 😉

    MFG Helfer


Anmelden zum Antworten