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