"Speicherentleerung" nach dem Beenden



  • Ich hab mir eine kleine Fkt geschrieben mit der ich Bitmaps am Screen ausgeben kann. Soweit so gut. Habs auch "brav" am Ende mit SelectObject und DeleteObject den Speicher entleert bzw den DC. Wenn ich die Fkt jetzt so 10 mal aufrufe klappt noch immer alles wunderbar, nur dauert das beenden des Programms auf einmal ewig lang und ich merke auch an Winamp das er ziemlich am Arbeiten ist, weil die Musik hängen bleibt. Je öfter ich die Fkt aufrufe desto länger dauerts. Ich tippe mal darauf, dass der Speicher bzw DC nicht richtig entleert wird. Hier ist mal der Code:

    void DrawBitmap(HINSTANCE hInst,TCHAR image[])
    {
        HBITMAP hBitmap = (HBITMAP)LoadImage(hInst,image,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    
        HDC hdc = GetDC(hwnd);
        HDC image_dc = CreateCompatibleDC(hdc);
    
        HBITMAP old_hBitmap = (HBITMAP)SelectObject(image_dc,hBitmap);
    
        BitBlt(hdc,0,0,640,480,image_dc,0,0,SRCCOPY);
    
        SelectObject(image_dc,old_hBitmap);
        DeleteObject(old_hBitmap);
        ReleaseDC(hwnd,hdc);
        DeleteDC(image_dc);
    
        TextOutput(">>Bitmap successfully drawn...",TXT_TYPE_MAIN);
    }/* DrawBitmap */
    

    Irgend eine Idee, wie ich den Code verbessern könnte?

    Danke im Voraus

    CU



  • Du löscht mit DeleteObject bisher das Bitmap, das vorher im DC war, das Bitmap, welches du lädst wird nie gelöscht!
    Ich würde das so machen:

    void DrawBitmap(HINSTANCE hInst,TCHAR image[])
    {
        HBITMAP hBitmap = (HBITMAP)LoadImage(hInst,image,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    
        // Maße des Bitmaps ermitteln
        BITMAP bitmap;
        GetObject (hBitmap, sizeof(BITMAP), &bitmap);
    
        HDC hdc = GetDC(hwnd);
        HDC image_dc = CreateCompatibleDC(hdc);
    
        SelectObject(image_dc, hBitmap);
    
        BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, image_dc, 0, 0, SRCCOPY);
    
        DeleteDC(image_dc);
        ReleaseDC(hwnd, hdc);
    
        DeleteObject (hBitmap);
    
        TextOutput(">>Bitmap successfully drawn...",TXT_TYPE_MAIN);
    }/* DrawBitmap */
    

    Das zurück selektieren kannst du dir in dem Fall (Bitmap in einen DC im Speicher selektieren) sparen (schaden tut es aber nicht)!

    Q: Windows Programmierung von C. Petzold

    [ Dieser Beitrag wurde am 17.11.2002 um 13:11 Uhr von flenders editiert. ]



  • Danke das wird helfen...

    Das kommt halt davon wenn man sich einbildet, man könnte den Code eines Tuts selber verbessern 🙂 (noch dazu den von gametutorials.com)



  • Ok, um ehrlich zu sein, viel gebracht hats nicht, aber mir is beim rumprobieren aufgefallen, dass das Problem nur im Fullscreen existiert. Im Fenster-Modus kann ich die Fkt aufrufen so oft ich will ein Druck auf Esc und weg ist das Fenster.... irgendwelche Ideen? 🙄



  • Jetzt hab ich doch tatsächlich das DeleteObject wieder vergessen! Und der Cast war natürlich auch unsinnig.
    Hab den Code jetzt geändert!

    [ Dieser Beitrag wurde am 17.11.2002 um 13:12 Uhr von flenders editiert. ]



  • Jep, es geht. Danke für die Hilfe.. wäre nämlich blöd gewesen wenn jemand ein Spiel ne halbe Stunde spielt und das dann eine stunde zum beenden braucht 🙂

    THX


Anmelden zum Antworten