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 |
|
Biblioteca |
|