Condividi tramite


Thread di streaming e Filter Graph Manager

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Quando Filter Graph Manager arresta il grafico, attende che tutti i thread di streaming si arrestino. Ciò comporta le implicazioni seguenti per i filtri:

  • Un filtro non deve mai chiamare metodi in Filter Graph Manager da un thread di streaming.

    Filter Graph Manager usa una sezione critica per sincronizzare le proprie operazioni. Se un thread di streaming tenta di contenere questa sezione critica, può causare un deadlock. Ad esempio: si supponga che un altro thread arresti il grafico. Tale thread accetta il blocco del grafo del filtro e attende che il filtro interrompa il recapito dei dati. Se il filtro è in attesa del blocco, non verrà mai arrestato, causando un deadlock.

  • Un filtro non deve mai aggiungereRef o QueryInterface a Filter Graph Manager da un thread di streaming.

    Se il filtro contiene un conteggio dei riferimenti in Filter Graph Manager (tramite AddRef o QueryInterface), potrebbe diventare l'ultimo oggetto a contenere un conteggio dei riferimenti. Quando il filtro chiama Release, Filter Graph Manager viene eliminato definitivamente. All'interno della routine di pulizia, Filter Graph Manager tenta di arrestare il grafico, causando l'attesa dell'uscita del thread di streaming. Tuttavia, è in attesa all'interno del thread di streaming, quindi il thread di streaming non può uscire. Il risultato è un deadlock.