Classe CAMThread
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
A CAMThread
classe é uma classe abstrata para gerenciar threads de trabalho.
Variáveis de membro protegidas | Descrição |
---|---|
m_hThread | Manipule para o thread. |
Variáveis de membro público | Descrição |
m_AccessLock | Seção crítica que impede que o thread seja acessado por outros threads. |
m_WorkerLock | Seção crítica que bloqueia dados compartilhados entre threads. |
Métodos públicos | Descrição |
Camthread | Método de construtor. |
~Camthread | Método de destruidor. Virtual. |
InitialThreadProc | Chama o método ThreadProc quando o thread é criado. |
Criar | Cria o thread. |
CallWorker | Sinaliza o thread com uma solicitação. |
Fechar | Aguarda a saída do thread e, em seguida, libera seus recursos. |
ThreadExists | Consulta se o thread existe. |
Getrequest | Aguarda a próxima solicitação. |
CheckRequest | Verifica se há uma solicitação, sem bloqueio. |
Resposta | Responde a uma solicitação. |
GetRequestHandle | Recupera um identificador para o evento sinalizado pelo método CallWorker. |
GetRequestParam | Recupera a solicitação mais recente. |
CoInitializeHelper | Chama CoInitializeEx no início do thread. |
Métodos virtuais puros | Descrição |
Threadproc | Procedimento de thread. |
Comentários
Essa classe fornece métodos para criar um thread de trabalho, passar solicitações para o thread e aguardar a saída do thread. Para usar essa classe, faça o seguinte:
- Derive uma classe de
CAMThread
e substitua o método virtual puro CAMThread::ThreadProc. Esse método é o procedimento de thread que é chamado no início do thread. - Em seu aplicativo, crie uma instância da classe derivada. A criação do objeto não cria o thread. Para criar o thread, chame o método CAMThread::Create .
- Para enviar solicitações para o thread, chame o método CAMThread::CallWorker . Esse método usa um parâmetro DWORD, cujo significado é definido por sua classe. O método é bloqueado até que o thread responda (veja abaixo).
- No procedimento de thread, responda às solicitações chamando CAMThread::GetRequest ou CAMThread::CheckRequest. O método GetRequest é bloqueado até que outro thread chame CallWorker. O método CheckRequest não está bloqueando, o que permite que o thread marcar para novas solicitações enquanto trabalha de forma assíncrona.
- Quando o thread receber uma solicitação, chame CAMThread::Reply para desbloquear o thread de chamada. O método Reply usa um parâmetro DWORD, que é passado para o thread de chamada como o valor retornado para CallWorker.
Quando terminar o thread, chame o método CAMThread::Close . Esse método aguarda a saída do thread e fecha o identificador de thread. Sua mensagem ThreadProc deve ser garantida para sair, por conta própria ou em resposta a uma solicitação CallWorker. O método destruidor também chama Close.
O exemplo a seguir ilustra estas etapas:
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.
}
Em sua classe derivada, você também pode definir funções membro que validam os parâmetros para CallWorker. O exemplo a seguir mostra uma maneira típica de fazer isso:
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); }
A CAMThread
classe fornece duas seções críticas como variáveis de membro público. Use CAMThread::m_AccessLock
para impedir que o thread seja acessado por outros threads. (Por exemplo, os métodos Create e CallWorker mantêm esse bloqueio para serializar operações no thread.) Use CAMThread::m_WorkerLock para bloquear dados compartilhados entre threads.
Requisitos
Requisito | Valor |
---|---|
parâmetro |
|
Biblioteca |
|