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.
-
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?
-
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.
-
ich hab wirklich NULL ahnung von directshow

versuch mal mit
sample->Release();
-
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.
-
ReleaseDC

-
Danke, RelaseDC hat wunderbar funktioniert!""