Freigeben über


Streamingthreads und filter Graph-Manager

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Wenn der Filter Graph-Manager das Diagramm beendet, wartet er, bis alle Streamingthreads heruntergefahren werden. Dies hat folgende Auswirkungen auf Filter:

  • Ein Filter darf niemals Methoden für den Filtergraph-Manager aus einem Streamingthread aufrufen.

    Der Filter Graph-Manager verwendet einen kritischen Abschnitt, um seine eigenen Vorgänge zu synchronisieren. Wenn ein Streamingthread versucht, diesen kritischen Abschnitt zu halten, kann dies zu einem Deadlock führen. Beispiel: Angenommen, ein anderer Thread beendet das Diagramm. Dieser Thread übernimmt die Filterdiagrammsperre und wartet, bis der Filter die Daten nicht mehr bereitstellt. Wenn Ihr Filter auf die Sperre wartet, wird er nie beendet, was zu einem Deadlock führt.

  • Ein Filter darf niemals AddRef oder QueryInterface für den Filtergraph-Manager aus einem Streamingthread verwenden.

    Wenn der Filter eine Verweisanzahl für den Filtergraph-Manager enthält (über AddRef oder QueryInterface), wird er möglicherweise das letzte Objekt, das eine Verweisanzahl enthält. Wenn der Filter Release aufruft, zerstört sich der Filtergraph-Manager selbst. Innerhalb seiner Bereinigungsroutine versucht der Filter Graph-Manager, das Diagramm zu beenden, sodass er auf das Beenden des Streamingthreads wartet. Es wartet jedoch innerhalb des Streamingthreads, sodass der Streamingthread nicht beendet werden kann. Das Ergebnis ist ein Deadlock.