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
Wxutil.h (inclua Streams.h)
Biblioteca
Strmbase.lib (builds de varejo);
Strmbasd.lib (builds de depuração)