2012-03-20 3 views
1

DirectShowNet을 사용하고 그래프가 중지되면 com 개체를 해제합니다.DirectShow 그래프 정리 - DirectShow 그래프가 중지되지 않습니다.

COM 개체 [필터, 인터페이스]를 해제하려고 시도하는 동안이 정리가 STOPPED.It의 "일시 중단"이 아닌 DirectShow의 원인 일 때가 있습니다. ... [내가 메모리 누수가 제외]

내가 [릴리스 COM 개체]를 최대 CLEN하지 않으면 모든게은 OK입니다 여기

내가 정리 만드는 방법은 다음과 같습니다

if (videoWindow != nullptr) 
{ 
    Marshal::ReleaseComObject(videoWindow); 
    videoWindow = nullptr; 

} 

if (mediaControl != nullptr) 
{ 
    Marshal::ReleaseComObject(mediaControl); 
    mediaControl = nullptr;    
} 


if (graphBuilder != nullptr) 
{ 
    Marshal::ReleaseComObject(graphBuilder); 
    graphBuilder = nullptr; 

} 

을 .. ..

무엇이 잘못되었을 수 있습니까? 필터를 잘못된 방법으로 다시 지정합니까? 이 "unstopable 그래프"가 발생할 수있는 원인은 무엇입니까?

답변

2

정확하게 멈춘 전화 (얼어 붙은 전화)와 통화 스택이 무엇인지 언급하지 않았습니다.

오류가있는 필터 또는 오류 콜백이있는 Sample Grabber 필터 일 수 있으며 중지 요청을받은 "기본"스레드와 백그라운드 스레드의 작업자 스레드 또는 작업자 활동을 동기화하지 못하는 경우가 일반적인 시나리오입니다 , 결국 죽은 사람을 잠근다. 디버거에서 스레드 상태를 확인하여 깨진 구성 요소를 식별 할 수 있어야합니다.

특정 필터로 문제를 격리하는 또 다른 방법은 특정 조각을 파이프 라인에서 일시적으로 제거하고 어떤 조각이 문제를 유발하는지 추가/제거하는지 확인하는 것입니다.

+0

더 오래된 디코더 필터 [ffdshow]가이 문제를 일으킨 것으로 보입니다. [스스로 파괴하지 않습니다]. 디코더 필터를 업데이트하고 이제는 닫습니다. – Novalis