Compartir a través de


CAMThread (clase)

[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.

La CAMThread clase es una clase abstracta para administrar subprocesos de trabajo.

Variables miembro protegidas Descripción
m_hThread Identificador del subproceso.
Variables de miembro público Descripción
m_AccessLock Sección crítica que impide que otros subprocesos accedan al subproceso.
m_WorkerLock Sección crítica que bloquea los datos compartidos entre subprocesos.
Métodos públicos Descripción
CAMThread Método constructor.
~ CAMThread Método de destructor. Virtual.
InitialThreadProc Llama al método ThreadProc cuando se crea el subproceso.
Crear Crea el subproceso.
CallWorker Indica el subproceso con una solicitud.
Cerrar Espera a que se cierre el subproceso y, a continuación, libera sus recursos.
ThreadExists Consulta si el subproceso existe.
GetRequest Espera la siguiente solicitud.
CheckRequest Comprueba si hay una solicitud, sin bloqueo.
Respuesta Responde a una solicitud.
GetRequestHandle Recupera un identificador del evento señalado por el método CallWorker.
GetRequestParam Recupera la solicitud más reciente.
CoInitializeHelper Llama a CoInitializeEx al principio del subproceso.
Métodos virtuales puros Descripción
ThreadProc Procedimiento de subproceso.

Observaciones

Esta clase proporciona métodos para crear un subproceso de trabajo, pasar solicitudes al subproceso y esperar a que el subproceso salga. Para usar esta clase, haga lo siguiente:

  • Derive una clase de CAMThread e invalide el método virtual puro CAMThread::ThreadProc. Este método es el procedimiento de subproceso al que se llama al principio del subproceso.
  • En la aplicación, cree una instancia de la clase derivada. La creación del objeto no crea el subproceso. Para crear el subproceso, llame al método CAMThread::Create .
  • Para enviar solicitudes al subproceso, llame al método CAMThread::CallWorker . Este método toma un parámetro DWORD, cuyo significado se define mediante la clase . El método se bloquea hasta que el subproceso responde (consulte a continuación).
  • En el procedimiento de subproceso, responda a las solicitudes llamando a CAMThread::GetRequest o CAMThread::CheckRequest. El método GetRequest se bloquea hasta que otro subproceso llama a CallWorker. El método CheckRequest no está bloqueado, lo que permite al subproceso comprobar si hay nuevas solicitudes mientras se trabaja de forma asincrónica.
  • Cuando el subproceso recibe una solicitud, llame a CAMThread::Reply para desbloquear el subproceso que realiza la llamada. El método Reply toma un parámetro DWORD, que se pasa al subproceso que realiza la llamada como valor devuelto para CallWorker.

Cuando haya terminado con el subproceso, llame al método CAMThread::Close . Este método espera a que el subproceso salga y, a continuación, cierra el identificador del subproceso. El mensaje threadProc debe garantizarse para salir, ya sea por su cuenta o en respuesta a una solicitud CallWorker. El método destructor también llama a Close.

En el ejemplo siguiente se muestran estos pasos:

class MyThread : public CAMThread
{
protected:
    DWORD ThreadProc(void);
};

DWORD MyThread::ThreadProc()
{
    BOOL bShutDown = FALSE;
    while (!bShutDown)
    {
        DWORD req = GetRequest();
        printf("Request: %d\n", req);
        bShutDown = (req == 0);
        Reply(bShutDown ? S_FALSE : S_OK);
    }
    printf("Quitting Thread\n");
    return 1;
}

void main()
{
    MyThread thread;
    DWORD reply;
    
    thread.Create();
    reply = thread.CallWorker(3);
    reply = thread.CallWorker(0); // Thread exits.
}

En la clase derivada, también puede definir funciones miembro que validen los parámetros en CallWorker. En el ejemplo siguiente se muestra una manera típica de hacerlo:

enum Command {CMD_INIT, CMD_RUN, CMD_STOP, CMD_EXIT};

HRESULT Init(void)  { return CallWorker(CMD_INIT); }
HRESULT Run(void)   { return CallWorker(CMD_RUN); }
HRESULT Stop(void)  { return CallWorker(CMD_STOP); }
HRESULT Exit(void)  { return CallWorker(CMD_EXIT); }

La CAMThread clase proporciona dos secciones críticas como variables miembro públicas. Use CAMThread::m_AccessLock para bloquear que otros subprocesos accedan al subproceso. (Por ejemplo, los métodos Create y CallWorker contienen este bloqueo para serializar las operaciones en el subproceso). Use CAMThread::m_WorkerLock para bloquear los datos que se comparten entre subprocesos.

Requisitos

Requisito Value
Encabezado
Wxutil.h (include Streams.h)
Biblioteca
Strmbase.lib (compilaciones comerciales);
Strmbasd.lib (compilaciones de depuración)