Classe CAMThread

La CAMThread classe è una classe astratta per la gestione dei thread di lavoro.

Variabili membro protette Descrizione
m_hThread Gestire il thread.
Variabili membro pubbliche Descrizione
m_AccessLock Sezione critica che blocca l'accesso al thread da altri thread.
m_WorkerLock Sezione critica che blocca i dati condivisi tra i thread.
Metodi pubblici Descrizione
CAMThread Metodo 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 l'uscita del thread, quindi rilascia le relative risorse.
ThreadExists Esegue query sul fatto che il thread esista.
Getrequest Attende la richiesta successiva.
CheckRequest Verifica se è presente una richiesta, senza bloccare.
Rispondi Risponde a una richiesta.
GetRequestHandle Recupera un handle all'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 blocca fino a quando il thread risponde (vedere di seguito).
  • Nella procedura thread rispondere alle richieste chiamando CAMThread::GetRequest o CAMThread::CheckRequest. Il metodo GetRequest 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, chiamare CAMThread::Reply per sbloccare il thread chiamante. Il metodo Reply accetta un parametro DWORD, 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. Il messaggio ThreadProc deve essere garantito di uscire, autonomamente o in risposta a una richiesta callworker. Il metodo distruttore chiama anche Close.

Nell'esempio seguente vengono illustrati 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. Nell'esempio seguente viene illustrato 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 pubbliche. Usare CAMThread::m_AccessLock per bloccare l'accesso al thread da altri thread. Ad esempio, i metodi Create and CallWorker contengono questo blocco per serializzare le operazioni nel thread. Usare CAMThread::m_WorkerLock per bloccare i dati condivisi tra i thread.

Requisiti

Requisito Valore
Intestazione
Wxutil.h (includere Flussi.h)
Libreria
Strmbase.lib (build al dettaglio);
Strmbasd.lib (build di debug)