Поделиться через


Потоки потоковой передачи и диспетчер графа фильтров

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

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

  • Фильтр никогда не должен вызывать методы диспетчера фильтров Graph из потока потоковой передачи.

    Диспетчер графов фильтров использует критически важный раздел для синхронизации собственных операций. Если поток потоковой передачи пытается удержать этот критически важный раздел, это может привести к взаимоблокировке. Например, предположим, что другой поток останавливает граф. Этот поток принимает блокировку графа фильтра и ожидает, пока фильтр перестанет доставлять данные. Если фильтр ожидает блокировки, она никогда не остановится, что приведет к взаимоблокировки.

  • Фильтр никогда не должен добавлять Ссылки или QueryInterface диспетчера фильтров Graph из потока потоковой передачи.

    Если фильтр содержит количество ссылок в диспетчере графов фильтров (с помощью AddRef или QueryInterface), он может стать последним объектом для хранения счетчика ссылок. Когда фильтр вызывает Release, диспетчер фильтров Графа уничтожает себя. В процедуре очистки диспетчер графов фильтров пытается остановить граф, в результате чего он будет ожидать выхода потока потоковой передачи. Однако он ожидает внутри потока потоковой передачи, поэтому поток потоковой передачи не может выйти. В результате возникает взаимоблокировка.