Condividi tramite


Multithreading: creazione di thread dell'interfaccia utente

I thread dell'interfaccia utente vengono in genere utilizzati per gestire gli input dell'utente e per rispondere a eventi utente, in modo indipendente dai thread che eseguono altre parti dell'applicazione. Il thread principale dell'applicazione, fornito nella classe derivata da CWinApp, è già stato creato e avviato automaticamente. In questo argomento vengono descritti i passaggi necessari per la creazione di thread dell'interfaccia utente aggiuntivi.

La prima operazione da eseguire durante la creazione di un thread dell'interfaccia utente consiste nel derivare una classe da CWinThread. È necessario dichiarare e implementare questa classe utilizzando le macro DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE. L'override di alcune funzioni da parte della classe è obbligatorio, mentre quello di altre è facoltativo. Nella tabella che segue sono indicate queste funzioni e il relativo funzionamento.

Funzioni da sottoporre a override durante la creazione di un thread dell'interfaccia utente

Funzione

Scopo

ExitInstance

Eseguire le operazioni di pulizia quando il thread termina. Normalmente sottoposta a override.

InitInstance

Eseguire l'inizializzazione dell'istanza del thread. Deve essere sottoposta a override.

OnIdle

Eseguire l'elaborazione in fase di inattività specifica del thread. Generalmente non sottoposta a override.

PreTranslateMessage

Applicare un filtro ai messaggi prima che siano inviati a TranslateMessage e DispatchMessage. Generalmente non sottoposta a override.

ProcessWndProcException

Intercettare le eccezioni non gestite generate dai gestori di comandi e messaggi del thread. Generalmente non sottoposta a override.

Run

Funzione di controllo per il thread. Contiene il message pump. Raramente sottoposta a override.

In MFC sono disponibili due versioni di AfxBeginThread tramite l'overload del parametro: una per i thread dell'interfaccia utente e l'altra per i thread di lavoro. Per avviare il thread dell'interfaccia utente, chiamare AfxBeginThread, specificando le informazioni che seguono:

  • RUNTIME_CLASS della classe derivata da CWinThread.

  • Il livello di priorità desiderato (facoltativo). Il livello di priorità predefinito è normale. Per ulteriori informazioni sui livelli di priorità disponibili, vedere SetThreadPriority in Windows SDK.

  • La dimensione dello stack desiderata per il thread (facoltativo). Il valore predefinito corrisponde alla dimensione dello stack del thread di creazione.

  • CREATE_SUSPENDED, se si desidera che il thread sia creato in uno stato sospeso (facoltativo). Il valore predefinito è 0, che corrisponde all'avvio normale del thread.

  • Gli attributi di sicurezza desiderati (facoltativo). L'accesso predefinito è identico a quello del thread padre. Per ulteriori informazioni sul formato di queste informazioni sulla sicurezza, vedere SECURITY_ATTRIBUTES in Windows SDK.

AfxBeginThread esegue automaticamente la maggior parte delle operazioni necessarie. Viene creato un nuovo oggetto della classe e inizializzato con le informazioni specificate, quindi viene chiamato CWinThread::CreateThread per avviare l'esecuzione del thread. Nel corso della routine vengono effettuati controlli per assicurare che tutti gli oggetti siano resi disponibili in modo corretto, nell'eventualità che una parte della creazione non riuscisse.

Scegliere l'argomento su cui visualizzare maggiori informazioni

Vedere anche

Concetti

Multithreading con C++ e MFC