Multithreading: creazione di thread dell'interfaccia utente
Aggiornamento: novembre 2007
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 |
---|---|
Eseguire le operazioni di pulizia quando il thread termina. Normalmente sottoposta a override. |
|
Eseguire l'inizializzazione dell'istanza del thread. Deve essere sottoposta a override. |
|
Eseguire l'elaborazione in fase di inattività specifica del thread. Generalmente non sottoposta a override. |
|
Applicare un filtro ai messaggi prima che siano inviati a TranslateMessage e DispatchMessage. Generalmente non sottoposta a override. |
|
Intercettare le eccezioni non gestite generate dai gestori di comandi e messaggi del thread. Generalmente non sottoposta a override. |
|
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 protezione 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.