SelectObject(memDC, bitmap) failed with error 0x00000008



  • hallo zusammen!

    ich speichere beim programmstart ein wxMemoryDC mdc, um sie für dasselbe panel wiederverwenden zu können.
    zu unterschiedlichen laufzeiten crasht das programm beim aufruf von

    mdc->SelectObject(*allBtmp);
    

    wobei die wxBitmap allBtmp völlig ok ist.

    die fehlermeldung lautet:

    ..\..\src\msw\dcmemory.cpp(116): 'SelectObject(memDC, bitmap)' failed with error 0x00000008 (für diesen Befehl ist nicht genügend Speicher verfügbar.).
    ..\..\src\msw\dcmemory.cpp(118): assert "wxAssertFailure" failed in wxMemoryDC::DoSelect(): Couldn't select a bitmap into wxMemoryDC [in child thread]

    ich habe versucht, den process heap auf low fragmentation umzuschalten, was aber nichts genützt hat.
    memory leaks sind auch nicht vorhanden.
    laut task manager bleibt die speicherauslastung konstant.

    kann ich irgendwie die größe des verfügbaren speichers auslesen, damit ich das problem irgendwie eingrenzen kann? oder hat jemand eine andere idee?

    danke!



  • ein neuer hinweis ist aufgetreten: das programm lief 25min ohne probleme und der crash kam in dem moment, als ich firefox geöffnet habe, der rechner also kurzzeitig anderweitig beschäftigt war.
    kann ich vielleicht so eine auslastung detektieren und verhindern?



  • Das richt ja nach einem Handle-leak. Was macht du den mit den Handles die SelectObject() zurückgibt?



  • @hll: danke für den tip! um das genauer zu verstehen habe ich mir mal http://en.wikipedia.org/wiki/Handle_leak durchgelesen. auslöser wäre danach eine nicht geschlossene ressource, was ich gecheckt habe. sowohl das wxBitmap, auf das ich zeichne, als auch die wxMemoryDC speichere ich über die gesamte programmlaufzeit zwischen, damit sie wiederverwendet werden können. nur beim kopieren der bitmap auf den bildschirm mache ich:

    wxPaintDC dc(this);
    memdc->SelectObject(wxNullBitmap);
    dc.DrawBitmap(*btmp, 0, 0);
    memdc->SelectObject(*btmp);
    

    könnte da ein problem liegen?

    es sieht sogar danach aus, als wenn das problem nur bestehen würde, wenn ich eine "grafikintensive" webseite offen habe. wenn ich z.b. http://www.n-tv.de/wissen/ fertig geladen von der taswkleiste einblende, dann läuft das programm deutlich langsamer und crasht kurz darauf. bei der forumsseite hier passiert hingegen nichts.
    kann man da was machen?



  • es scheint tatsächlich ein handle leak zu sein. ich habe einen exklusiven zugriff auf die wxMemoryDC und wxBitmap implementiert und das problem ist deutlich geringer geworden. ein weiteres teilproblem war wohl auch ein callback aus einer e/a dll, der das paint event auslöste. der läuft mit einer konstanten datenrate, während das programm die daten unterschiedlich schnell verarbeitet. vermutlich wurde dann ein handle für eine dc angefordert, welches aber noch nicht freigegeben war.
    danke für die anregung!


Anmelden zum Antworten