2012-03-20 4 views
1

Я использую DirectShowNet, и когда мой график остановлен, я освобождаю объекты com.Очистка графика DirectShow - График DirectShow не останавливается

Проблема заключается в том, что, хотя я пытаюсь освободить COM-объекты [фильтры, интерфейс], иногда эта очистка вызывает прямой график show not STOPPED.It «suspend».

Если я не делаю člen до [выпуск COM-объектов] Everthing в порядке [кроме меня есть утечки памяти] ...

Вот как я сделать ВЫМЫТЬ:

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

} 

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


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

} 

.. ..

Что может быть неправильным? Я неправильно фильтрую фильтры? Что может вызвать этот «неудержимый граф»?

ответ

2

Вы не указали, какие именно вызовы остановлены (заморожены) и что такое стек вызовов.

Это типичный сценарий, в котором дефектный фильтр, или он может быть фильтром Sample Grabber с ошибочным обратным вызовом, не может синхронизировать «основной» поток, на который он принимает запрос на остановку, и рабочий поток или активность работника в фоновом потоке , и в конечном итоге блокирует мертвых. Вы должны иметь возможность идентифицировать сломанный компонент, проверяя состояния потоков в отладчике.

Другим методом выделения проблемы для конкретного фильтра является временное удаление определенного фрагмента из конвейера и обнаружение добавления/удаления фрагмента, приводящего к проблемам.

+0

Похоже, что старый фильтр декодера [ffdshow] вызывает это. [Он не разрушает себя]. Я обновляю фильтр декодера, и теперь он закрывается. – Novalis