Потоки потоковой передачи и диспетчер графов фильтров
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи захватом аудио и видео в рамках Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Когда диспетчер графов фильтров останавливает граф, он ожидает завершения работы всех потоковых потоков. Это имеет следующие последствия для фильтров:
Фильтр ни в коем случае не должен вызывать методы менеджера графа фильтров из потока передачи данных.
Диспетчер графов фильтров использует критически важный раздел для синхронизации собственных операций. Если поток потоковой передачи пытается сохранить этот критически важный раздел, это может привести к взаимоблокировке. Например, предположим, что другой поток останавливает граф. Этот поток захватывает блокировку графа фильтра и ждет, пока ваш фильтр не прекратит доставку данных. Если фильтр ожидает блокировки, он никогда не остановится, вызвав взаимоблокировку.
Фильтр никогда не должен из потокового режима вызывать AddRef или QueryInterface у диспетчера графов фильтров.
Если фильтр удерживает счетчик ссылок на диспетчер графов фильтров (через AddRef или QueryInterface), он может оказаться последним объектом, удерживающим счетчик ссылок. Когда фильтр вызывает функцию Release, диспетчер фильтров графов уничтожает сам себя. В подпрограмме очистки диспетчер графов фильтров пытается остановить граф, что приводит к ожиданию выхода потока потоковой передачи. Однако он находится в ожидании внутри потока трансляции, поэтому поток трансляции не может завершиться. Результатом является взаимоблокировка.