Speicher läuft voll und Programm stürzt ab



  • Hallo,

    Ich habe das Problem, dass bei meinem Programm der Speicher vollläuft und es dann abstürzt. Das Programm ließt den Videostream einer Webcam und zeigt das Bild in einem Fenster.
    Ich habe den Problemherd schon etwas eingekreist. Bei jedem Sample, das ich hole, erhöt sich der Speicher.

    Ich denke das Problem liegt in folgenden Zeilen:

    HRESULT CGetVideo::DoRenderSample(IMediaSample *sample)
    {		
    	BYTE* data = 0;
    	sample->GetPointer( &data );
    
    	BITMAPINFO bmi={0};
    	bmi.bmiHeader=bmih; 
    	RECT r; 
    	GetClientRect( hwnd, &r );
    
    	return StretchDIBits(GetDC(hwnd),0,16,r.right,r.bottom-16,0,0,w,h,data,&bmi,DIB_RGB_COLORS,SRCCOPY);
    
    };
    

    Ich denke, aber das ist wirklich nur eine Vermutung, dass das Problem in der CBaseRenderer Class in der DoRenderSample Methode liegt.

    Ist es möglich den Speicher immer wieder auf "0" zu setzten?

    Oder ist es ein anderers Problem, dass mein Programm abstürzt?

    Das gesamte Programm ist zu finden unter:

    http://www.codeproject.com/useritems/VideoImageGrabber.asp

    vielen Dank für eure Hilfe!!!

    PS: Wenn ihr das Programm debuggen wollt müsst ihr zusätzliche Bibliotheken einbinden: strmbasd.lib, strmiids.lib und winmm.lib
    Außerdem müsst ihr LIBCD.lib ignorieren.
    Zusätzlich braucht ihr die streams.h Headerdatei. Alles gibt es im Platform SDK.


  • Mod

    hab zwar keine ahnug, würde aber vermuten dass IMediaSample *sample auf ein objekt zeit das nicht freigegeben wird.



  • rapso schrieb:

    ..., dass IMediaSample *sample auf ein objekt zeit das nicht freigegeben wird.

    Daran habe ich auch schon gedacht.

    Wie könnte man dieses Problem Lösen?


  • Mod

    indem man sample nach benutzung freigibt? oder ist das jetzt sarkasmus von dir den ich nicht lustig finde 😕



  • rapso schrieb:

    indem man sample nach benutzung freigibt? oder ist das jetzt sarkasmus von dir den ich nicht lustig finde 😕

    -> nein ich bin zu blöd!! 😉 Das war wirklich kein Sarkasmus von mir!!

    Ich weis wirklich nicht wie sample freigeben kann. Vielleicht kannst du es mir einmal coden. BITTE!

    was ich schon versucht habe, immer mit einer Fehlermeldung, ist:

    delete sample;
    
    // und 
    
    delete data;
    
    // und
    
    free data;
    

    Was interesant ist, dass der der Speicher nach jedem Durchlauf der Methode um 4 Byte erhöht.
    Darum schätzte ich dass das Problem im Zeiger liegt.


  • Mod

    ich hab wirklich NULL ahnung von directshow 😉

    versuch mal mit

    sample->Release();
    

    btw http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directshow/htm/cmediasampleclass.asp



  • nein, mit Release() geht es auch nicht.
    trotzdem danke, ein Versuch war es wert.

    Ich glaube, dass ich den Fehler aber weiter eingekreist habe.

    nün würde ich behaupten, dass der Fehler in :

    return StretchDIBits(GetDC(hwnd),0,16,r.right,r.bottom-16,0,0,w,h,data,&bmi,DIB_RGB_COLORS,SRCCOPY);
    

    liegt.

    Ich habe die Zeile auskommentiert und mir den Wert "1" zurückgegeben.

    Danach habe ich zwar kein Bild mehr im Fenster, aber das Speicher erhöht sich nicht mehr.


  • Mod

    ReleaseDC 😉



  • Danke, RelaseDC hat wunderbar funktioniert!""


Anmelden zum Antworten