Существует ли автоматический способ защиты от «устаревших» ссылок интерфейса DirectShow? - PullRequest
0 голосов
/ 13 ноября 2011

У меня только что был длинный сеанс отладки, который был вызван «устаревшей» ссылкой на интерфейс в моем приложении Delphi 6 DirectShow, которое использует библиотеку компонентов DSPACK. Как вы знаете, есть некоторые операции, которые необходимо выполнить, когда граф фильтра активен, и некоторые операции, выполняемые с параметрами компонента, когда граф фильтра должен быть неактивным. Проблема заключается в том, что в результате вы можете получить ссылки на интерфейс DirectShow, которые по-прежнему имеют инициализированные значения (назначенные, но не NIL), но не действительны для текущего воплощения графика фильтра, поскольку они были созданы во время предыдущего воплощения графика фильтра. Это не так сложно сделать случайно, при включении и выключении графика фильтра для переключения между «живыми» операциями обнаружения и операциями автономной конфигурации. Примером автономной операции является настройка Moniker для одного из компонентов DSPACK, который будет использоваться при создании экземпляра конкретного фильтра при следующем включении графика.

Например, у вас может быть ссылка на IBaseFilter, назначенная вами при первой активации графика фильтра, которую вы пытались использовать повторно после деактивации и повторной активации графика фильтра. Ссылка на интерфейс теперь «устарела», потому что она принадлежит не текущему воплощению Графа фильтра, а предыдущему. Это приводит к всевозможным странным и не интуитивным сообщениям об ошибках DirectShow, которые не являются тем, чем они кажутся, но на самом деле из-за устаревшей ссылки на интерфейс.

Кто-нибудь придумал способ, будь то по соглашению или с помощью какого-нибудь умного решения, такого как интеллектуальный указатель DirectShow, привязанный к времени жизни графика фильтра и т. Д., Чтобы этого не произошло? Или это единственное решение, которое должно быть неослабно осторожным при использовании ссылок на интерфейсы?

1 Ответ

1 голос
/ 14 ноября 2011

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

Со стороны приложения вы можете управлять любым видом сикронизации, чтобы обозначить завершение работы. Например, перед остановкой / освобождением графа фильтра вы можете установить флаг завершения (логическая переменная), и в некотором роде обратного вызова обработки, который может быть запоздалым и требовать синхронизации, вы проверяете флаг и знаете, когда пришло время прерывать обработку из-за невыполненного запроса на прекращение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...