다음을 통해 공유


스트리밍 스레드 및 필터 그래프 관리자

[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, Media Foundation 오디오/비디오 캡처대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngineAudio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

필터 그래프 관리자가 그래프를 중지하면 모든 스트리밍 스레드가 종료되기를 기다립니다. 필터에는 다음과 같은 의미가 있습니다.

  • 필터는 스트리밍 스레드에서 Filter Graph Manager의 메서드를 호출해서는 안됩니다.

    필터 그래프 관리자는 중요한 섹션을 사용하여 자체 작업을 동기화합니다. 스트리밍 스레드가 이 중요한 섹션을 유지하려고 하면 교착 상태가 발생할 수 있습니다. 예: 다른 스레드가 그래프를 중지한다고 가정합니다. 해당 스레드는 필터 그래프 잠금을 사용하고 필터가 데이터 배달을 중지할 때까지 기다립니다. 필터가 잠금을 기다리는 경우 중지되지 않아 교착 상태가 발생합니다.

  • 필터는 스트리밍 스레드에서 Filter Graph Manager를 AddRef하거나 QueryInterface하면 안 됩니다.

    필터가 AddRef 또는 QueryInterface를 통해 Filter Graph Manager에 대한 참조 수를 보유하는 경우, 이는 참조 횟수를 보유하는 마지막 개체가 될 수 있습니다. 필터가 릴리스을 호출하면 필터 그래프 관리자가 스스로 소멸합니다. 정리 루틴 내에서 Filter Graph Manager는 그래프를 중지하려고 시도하여 스트리밍 스레드가 종료되기를 기다립니다. 그러나 스트리밍 스레드 내에서 대기 중이므로 스트리밍 스레드를 종료할 수 없습니다. 결과는 교착 상태입니다.