Suggerimenti per la risoluzione dei problemi
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare un nuovo codice MediaPlayer, IMFMediaEngine e Acquisizione audio/video in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
I suggerimenti seguenti consentono di evitare deadlock o arresti anomali nell'applicazione DirectShow.
oggetti globali
Un oggetto C++ globale non deve creare oggetti DirectShow nel metodo del costruttore o rilasciarli nel metodo distruttore. In questo modo l'applicazione può bloccarsi per un periodo illimitato, per il motivo seguente:
I thread non possono uscire mentre si trovano all'interno della funzione del punto di ingresso di una DLL. Il kernel 32 contiene un blocco di processo globale durante la funzione del punto di ingresso e il blocco impedisce l'uscita del thread. Poiché alcuni oggetti DirectShow possiedono thread, possono bloccarsi se rilasciati all'interno di una funzione di entry-point di una DLL. Se un'applicazione ha un oggetto C++ globale, la DLL di runtime C chiama il distruttore dell'oggetto quando la DLL viene scaricata. Se il distruttore rilascia oggetti DirectShow, questo può causare un blocco di conseguenza.
Per motivi simili, una DLL non deve creare o rilasciare oggetti DirectShow nella routine del punto di ingresso.
rilascio delle interfacce
È consigliabile rilasciare tutti i puntatori all'interfaccia DirectShow mentre l'applicazione sta ancora elaborando i messaggi, prima di uscire dal ciclo di messaggi. In caso contrario, potrebbero essere visualizzate varie asserzioni, perché alcuni oggetti DirectShow inviano messaggi durante le routine di pulizia.
Se si utilizza la classe ATL CWindowImpl, non attendere fino a OnFinalMessage per liberare le interfacce. Invece, liberarle quando si gestisce il messaggio WM_CLOSE.
conteggi dei riferimenti
Quando la versione di debug di Quartz.dll scarica, verifica se gli oggetti DirectShow hanno conteggi di riferimenti che non sono stati rilasciati. In tal caso, genera un'asserzione:
g_cFGObjects == 0
Quando l'asserzione ha esito negativo, significa che l'applicazione ha perduto un conteggio di riferimenti. Esaminare il codice e assicurarsi di rilasciare tutti i puntatori dell'interfaccia.
Argomenti correlati