Classe CAMThread
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
La CAMThread
classe è una classe astratta per la gestione dei thread di lavoro.
Variabili membro protette | Descrizione |
---|---|
m_hThread | Handle per il thread. |
Variabili membro pubblico | Descrizione |
m_AccessLock | Sezione critica che blocca l'accesso al thread da parte di altri thread. |
m_WorkerLock | Sezione critica che blocca i dati condivisi tra thread. |
Metodi pubblici | Descrizione |
CAMThread | Metodo del costruttore. |
~ CAMThread | Metodo distruttore. Virtuale. |
InitialThreadProc | Chiama il metodo ThreadProc quando viene creato il thread. |
Crea | Crea il thread. |
CallWorker | Segnala il thread con una richiesta. |
Chiudi | Attende che il thread venga chiuso, quindi rilascia le relative risorse. |
ThreadExists | Esegue una query per verificare se il thread esiste. |
Getrequest | Attende la richiesta successiva. |
CheckRequest | Controlla se è presente una richiesta, senza blocco. |
Rispondi | Risponde a una richiesta. |
GetRequestHandle | Recupera un handle per l'evento segnalato dal metodo CallWorker. |
GetRequestParam | Recupera la richiesta più recente. |
CoInitializeHelper | Chiama CoInitializeEx all'inizio del thread. |
Metodi virtuali pure | Descrizione |
Threadproc | Procedura thread. |
Commenti
Questa classe fornisce metodi per la creazione di un thread di lavoro, il passaggio delle richieste al thread e l'attesa dell'uscita del thread. Per usare questa classe, eseguire le operazioni seguenti:
- Derivare una classe da
CAMThread
ed eseguire l'override del metodo virtuale puro CAMThread::ThreadProc. Questo metodo è la routine thread che viene chiamata all'inizio del thread. - Nell'applicazione creare un'istanza della classe derivata. La creazione dell'oggetto non crea il thread. Per creare il thread, chiamare il metodo CAMThread::Create .
- Per inviare richieste al thread, chiamare il metodo CAMThread::CallWorker . Questo metodo accetta un parametro DWORD, il cui significato è definito dalla classe . Il metodo si blocca fino a quando il thread non risponde (vedere di seguito).
- Nella procedura di thread rispondere alle richieste chiamando CAMThread::GetRequest o CAMThread::CheckRequest. Il metodo GetRequest si blocca fino a quando un altro thread chiama CallWorker. Il metodo CheckRequest non blocca, che consente al thread di verificare la presenza di nuove richieste durante il funzionamento asincrono.
- Quando il thread riceve una richiesta, chiama CAMThread::Reply per sbloccare il thread chiamante. Il metodo Reply accetta un parametro DWORD, che viene passato al thread chiamante come valore restituito per CallWorker.
Al termine del thread, chiamare il metodo CAMThread::Close . Questo metodo attende l'uscita del thread e quindi chiude l'handle del thread. È necessario garantire che il messaggio ThreadProc venga chiuso autonomamente o in risposta a una richiesta callworker. Il metodo distruttore chiama anche Close.
L'esempio seguente illustra questi passaggi:
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.
}
Nella classe derivata è anche possibile definire funzioni membro che convalidano i parametri in CallWorker. L'esempio seguente illustra un modo tipico per eseguire questa operazione:
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
classe fornisce due sezioni critiche come variabili membro pubblico. Usare CAMThread::m_AccessLock
per bloccare l'accesso al thread da altri thread. Ad esempio, i metodi Create e CallWorker contengono questo blocco per serializzare le operazioni nel thread. Usare CAMThread::m_WorkerLock per bloccare i dati condivisi tra thread.
Requisiti
Requisito | Valore |
---|---|
Intestazione |
|
Libreria |
|