Threads de diffusion en continu et gestionnaire de graphe de filtre

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Lorsque le Gestionnaire de graphes de filtre arrête le graphe, il attend que tous les threads de diffusion en continu s’arrêtent. Cela a les implications suivantes pour les filtres :

  • Un filtre ne doit jamais appeler des méthodes sur le Gestionnaire de graphe de filtrage à partir d’un thread de streaming.

    Le Gestionnaire de graphes de filtre utilise une section critique pour synchroniser ses propres opérations. Si un thread de streaming tente de contenir cette section critique, cela peut provoquer un blocage. Par exemple : supposons qu’un autre thread arrête le graphe. Ce thread prend le verrou du graphe de filtre et attend que votre filtre cesse de fournir des données. Si votre filtre attend le verrou, il ne s’arrêtera jamais, ce qui provoquera un blocage.

  • Un filtre ne doit jamais AjouterRef ou QueryInterfacer le Gestionnaire de graphes de filtrage à partir d’un thread de streaming.

    Si le filtre contient un nombre de références sur le Gestionnaire de graphes de filtre (via AddRef ou QueryInterface), il peut devenir le dernier objet à contenir un nombre de références. Lorsque le filtre appelle Release, le Gestionnaire de graphes de filtre se détruit lui-même. Dans sa routine de nettoyage, le Gestionnaire de graphe de filtre tente d’arrêter le graphe, ce qui l’oblige à attendre la sortie du thread de streaming. Toutefois, il est en attente à l’intérieur du thread de streaming, de sorte que le thread de streaming ne peut pas se quitter. Le résultat est un blocage.