Очистить DirectShow Graph - граф DirectShow не останавливается - PullRequest
1 голос
/ 20 марта 2012

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

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

Если я не убираю [отпускаю com-объекты], все в порядке [кроме утечек памяти] ...

Вот как я делаю очистку:

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

}

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


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

}

....

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

1 Ответ

2 голосов
/ 21 марта 2012

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

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

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

...