Compartir a través de


Subprocesos de streaming y el Administrador de gráficos de filtros

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Cuando el Administrador de gráficos de filtros detiene el gráfico, espera a que se cierren todos los subprocesos de streaming. Esto tiene las siguientes implicaciones para los filtros:

  • Un filtro nunca debe llamar a métodos en el Administrador de gráficos de filtros desde un subproceso de streaming.

    Filter Graph Manager usa una sección crítica para sincronizar sus propias operaciones. Si un subproceso de streaming intenta contener esta sección crítica, puede provocar un interbloqueo. Por ejemplo: Supongamos que otro subproceso detiene el gráfico. Ese subproceso toma el bloqueo del grafo de filtro y espera a que el filtro deje de entregar datos. Si el filtro está esperando el bloqueo, nunca se detendrá, lo que provocará un interbloqueo.

  • Un filtro nunca debe agregarRef o QueryInterface el Administrador de gráficos de filtros desde un subproceso de streaming.

    Si el filtro contiene un recuento de referencias en el Administrador de gráficos de filtros (a través de AddRef o QueryInterface), podría convertirse en el último objeto para contener un recuento de referencias. Cuando el filtro llama a Release, el Administrador de gráficos de filtros se destruye a sí mismo. Dentro de su rutina de limpieza, el Administrador de gráficos de filtros intenta detener el gráfico, lo que hace que espere a que el subproceso de streaming salga. Sin embargo, está esperando dentro del subproceso de streaming, por lo que el subproceso de streaming no puede salir. El resultado es un interbloqueo.