Classe CWorkerThread

Questa classe crea un thread di lavoro o usa un thread di lavoro esistente, attende uno o più handle di oggetti kernel ed esegue una funzione client specificata quando viene segnalato uno degli handle.

Importante

Questa classe e i relativi membri non possono essere usati nelle applicazioni eseguite in Windows Runtime.

Sintassi

template <class ThreadTraits = DefaultThreadTraits>
class CWorkerThread

Parametri

ThreadTraits
Classe che fornisce la funzione di creazione del thread, ad esempio CRTThreadTraits o Win32ThreadTraits.

Membri

Strutture protette

Nome Descrizione
WorkerClientEntry

Costruttori pubblici

Nome Descrizione
CWorkerThread::CWorkerThread Costruttore per il thread di lavoro.
CWorkerThread::~CWorkerThread Distruttore per il thread di lavoro.

Metodi pubblici

Nome Descrizione
CWorkerThread::AddHandle Chiamare questo metodo per aggiungere l'handle di un oggetto waitable all'elenco gestito dal thread di lavoro.
CWorkerThread::AddTimer Chiamare questo metodo per aggiungere un timer di attesa periodico all'elenco gestito dal thread di lavoro.
CWorkerThread::GetThreadHandle Chiamare questo metodo per ottenere l'handle del thread di lavoro.
CWorkerThread::GetThreadId Chiamare questo metodo per ottenere l'ID thread del thread di lavoro.
CWorkerThread::Initialize Chiamare questo metodo per inizializzare il thread di lavoro.
CWorkerThread::RemoveHandle Chiamare questo metodo per rimuovere un handle dall'elenco di oggetti waitable.
CWorkerThread::Shutdown Chiamare questo metodo per arrestare il thread di lavoro.

Osservazioni:

Per usare CWorkerThread

  1. Creare un'istanza di questa classe.

  2. Chiamare CWorkerThread::Initialize.

  3. Chiamare CWorkerThread::AddHandle con l'handle di un oggetto kernel e un puntatore a un'implementazione di IWorkerThreadClient.

    o

    Chiamare CWorkerThread::AddTimer con un puntatore a un'implementazione di IWorkerThreadClient.

  4. Implementare IWorkerThreadClient::Execute per eseguire un'azione quando viene segnalato l'handle o il timer.

  5. Per rimuovere un oggetto dall'elenco di oggetti waitable, chiamare CWorkerThread::RemoveHandle.

  6. Per terminare il thread, chiamare CWorkerThread::Shutdown.

Requisiti

Intestazione: atlutil.h

CWorkerThread::AddHandle

Chiamare questo metodo per aggiungere l'handle di un oggetto waitable all'elenco gestito dal thread di lavoro.

HRESULT AddHandle(
    HANDLE hObject,
    IWorkerThreadClient* pClient,
    DWORD_PTR dwParam) throw();

Parametri

hObject
Handle di un oggetto waitable.

pClient
Puntatore all'interfaccia IWorkerThreadClient sull'oggetto da chiamare quando viene segnalato l'handle.

dwParam
Parametro da passare a IWorkerThreadClient::Execute quando viene segnalato l'handle.

Valore restituito

Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.

Osservazioni:

IWorkerThreadClient::Execute verrà chiamato tramite pClient quando viene segnalato l'handle hObject.

CWorkerThread::AddTimer

Chiamare questo metodo per aggiungere un timer di attesa periodico all'elenco gestito dal thread di lavoro.

HRESULT AddTimer(
    DWORD dwInterval,
    IWorkerThreadClient* pClient,
    DWORD_PTR dwParam,
    HANDLE* phTimer) throw();

Parametri

dwInterval
Specifica il periodo del timer in millisecondi.

pClient
Puntatore all'interfaccia IWorkerThreadClient sull'oggetto da chiamare quando viene segnalato l'handle.

dwParam
Parametro da passare a IWorkerThreadClient::Execute quando viene segnalato l'handle.

phTimer
[out] Indirizzo della variabile HANDLE che, in caso di esito positivo, riceve l'handle al timer appena creato.

Valore restituito

Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.

Osservazioni:

IWorkerThreadClient::Execute verrà chiamato tramite pClient quando il timer viene segnalato.

Passare l'handle timer da phTimer a CWorkerThread::RemoveHandle per chiudere il timer.

CWorkerThread::CWorkerThread

Costruttore.

CWorkerThread() throw();

CWorkerThread::~CWorkerThread

Distruttore.

~CWorkerThread() throw();

Osservazioni:

Chiama CWorkerThread::Shutdown.

CWorkerThread::GetThreadHandle

Chiamare questo metodo per ottenere l'handle del thread di lavoro.

HANDLE GetThreadHandle() throw();

Valore restituito

Restituisce l'handle di thread o NULL se il thread di lavoro non è stato inizializzato.

CWorkerThread::GetThreadId

Chiamare questo metodo per ottenere l'ID thread del thread di lavoro.

DWORD GetThreadId() throw();

Valore restituito

Restituisce l'ID thread o NULL se il thread di lavoro non è stato inizializzato.

CWorkerThread::Initialize

Chiamare questo metodo per inizializzare il thread di lavoro.

HRESULT Initialize() throw();

HRESULT Initialize(CWorkerThread<ThreadTraits>* pThread) throw();

Parametri

pThread
Thread di lavoro esistente.

Valore restituito

Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.

Osservazioni:

Questo metodo deve essere chiamato per inizializzare l'oggetto dopo la creazione o dopo una chiamata a CWorkerThread::Shutdown.

Per avere due o più CWorkerThread oggetti utilizzano lo stesso thread di lavoro, inizializzarne uno senza passare alcun argomento e quindi passare un puntatore a tale oggetto ai Initialize metodi degli altri. Gli oggetti inizializzati utilizzando il puntatore devono essere arrestati prima dell'oggetto utilizzato per inizializzarli.

Vedere CWorkerThread::Shutdown per informazioni su come cambia il comportamento di tale metodo quando viene inizializzato usando un puntatore a un oggetto esistente.

CWorkerThread::RemoveHandle

Chiamare questo metodo per rimuovere un handle dall'elenco di oggetti waitable.

HRESULT RemoveHandle(HANDLE hObject) throw();

Parametri

hObject
Handle da rimuovere.

Valore restituito

Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.

Osservazioni:

Quando l'handle viene rimosso IWorkerThreadClient::CloseHandle verrà chiamato sull'oggetto associato passato a AddHandle. Se la chiamata ha esito negativo, CWorkerThread chiamerà la funzione CloseHandle di Windows sull'handle.

CWorkerThread::Shutdown

Chiamare questo metodo per arrestare il thread di lavoro.

HRESULT Shutdown(DWORD dwWait = ATL_WORKER_THREAD_WAIT) throw();

Parametri

dwWait
Tempo in millisecondi di attesa dell'arresto del thread di lavoro. ATL_WORKER_THREAD_WAIT il valore predefinito è 10 secondi. Se necessario, è possibile definire il proprio valore per questo simbolo prima di includere atlutil.h.

Valore restituito

Restituisce S_OK in caso di esito positivo o un errore HRESULT in caso di errore, ad esempio se il valore di timeout, dwWait, viene superato.

Osservazioni:

Per riutilizzare l'oggetto, chiamare CWorkerThread::Initialize dopo aver chiamato questo metodo.

Si noti che la chiamata Shutdown a un oggetto inizializzato con un puntatore a un altro CWorkerThread oggetto non ha alcun effetto e restituisce sempre S_OK.

Vedi anche

DefaultThreadTraits
Classi
Multithreading: creazione di thread di lavoro
Interfaccia IWorkerThreadClient