Multithreading: creazione di thread dell'interfaccia utente MFC
Un thread dell'interfaccia utente viene comunemente usato per gestire l'input dell'utente e rispondere agli eventi utente indipendentemente dai thread che eseguono altre parti dell'applicazione. Il thread dell'applicazione principale (fornito nella CWinApp
classe derivata da ) è già stato creato e avviato automaticamente. In questo argomento vengono descritti i passaggi necessari per creare thread aggiuntivi dell'interfaccia utente.
La prima cosa da fare quando si crea un thread dell'interfaccia utente è derivare una classe da CWinThread. È necessario dichiarare e implementare questa classe usando le macro DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE . Questa classe deve eseguire l'override di alcune funzioni e può eseguire l'override di altre. Queste funzioni e le operazioni da eseguire vengono presentate nella tabella seguente.
Funzioni di cui eseguire l'override durante la creazione di un thread dell'interfaccia utente
Funzione | Scopo |
---|---|
ExitInstance | Eseguire la pulizia al termine del thread. In genere sottoposto a override. |
InitInstance | Eseguire l'inizializzazione dell'istanza del thread. Deve essere sottoposto a override. |
OnIdle | Eseguire l'elaborazione inattiva specifica del thread. In genere non sottoposto a override. |
PreTranslateMessage | Filtrare i messaggi prima che vengano inviati a TranslateMessage e DispatchMessage . In genere non sottoposto a override. |
ProcessWndProcException | Intercettare le eccezioni non gestite generate dai gestori di messaggi e comandi del thread. In genere non sottoposto a override. |
Run | Funzione di controllo per il thread. Contiene il message pump. Raramente sottoposto a override. |
MFC fornisce due versioni di AfxBeginThread
tramite l'overload di parametri: una che può creare solo thread di lavoro e una che può creare thread di lavoro o thread di interfaccia utente. Per avviare il thread dell'interfaccia utente, chiamare il secondo overload di AfxBeginThread, fornendo le informazioni seguenti:
Il RUNTIME_CLASS della classe derivata da
CWinThread
.(Facoltativo) Livello di priorità desiderato. Il valore predefinito è la priorità normale. Per altre informazioni sui livelli di priorità disponibili, vedere SetThreadPriority in Windows SDK.
(Facoltativo) Dimensioni dello stack desiderate per il thread. Il valore predefinito è lo stesso stack di dimensioni del thread di creazione.
(Facoltativo) CREATE_SUSPENDED se si desidera che il thread venga creato in uno stato sospeso. Il valore predefinito è 0 o avviare normalmente il thread.
(Facoltativo) Attributi di sicurezza desiderati. Il valore predefinito è lo stesso accesso del thread padre. Per altre informazioni sul formato di queste informazioni di sicurezza, vedere SECURITY_ATTRIBUTES in Windows SDK.
AfxBeginThread
fa la maggior parte del lavoro per te. Crea un nuovo oggetto della classe, lo inizializza con le informazioni fornite e chiama CWinThread::CreateThread per avviare l'esecuzione del thread. I controlli vengono eseguiti in tutta la procedura per assicurarsi che tutti gli oggetti vengano deallocati correttamente in caso di esito negativo di qualsiasi parte della creazione.