Multithreading: Criando threads da interface do usuário de MFC
Um thread da interface do usuário é comumente usado para manipular a entrada do usuário e responder a eventos de usuário, independentemente de threads executando outras partes do aplicativo. O thread de aplicativo principal (fornecido em sua classe derivada CWinApp
) já foi criado e iniciado para você. Este tópico descreve as etapas necessárias para criar threads adicionais da interface do usuário.
A primeira coisa que você deve fazer ao criar um thread da interface do usuário é derivar uma classe de CWinThread. Você deve declarar e implementar essa classe usando as macros DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE. Essa classe deve substituir algumas funções e pode substituir outras. Essas funções e o que elas devem fazer são apresentadas na tabela a seguir.
Funções a serem substituídas ao criar um thread da interface do usuário
Função | Finalidade |
---|---|
ExitInstance | Execute a limpeza quando o thread terminar. Normalmente substituído. |
InitInstance | Execute a inicialização da instância de thread. Deve ser substituído. |
OnIdle | Execute o processamento de tempo ocioso específico do thread. Normalmente não substituído. |
PreTranslateMessage | Filtre mensagens antes de serem enviadas para TranslateMessage e DispatchMessage . Normalmente não substituído. |
ProcessWndProcException | Intercepte as exceções sem tratamento geradas pelos manipuladores de comando e mensagem do thread. Normalmente não substituído. |
Executar | Controlando a função para o thread. Contém a bomba de mensagens. Raramente substituído. |
O MFC fornece duas versões de sobrecarga de parâmetro AfxBeginThread
: uma que só pode criar threads de trabalho e outra que pode criar threads da interface do usuário ou threads de trabalho. Para iniciar seu thread da interface do usuário, chame a segunda sobrecarga de AfxBeginThread, fornecendo as seguintes informações:
O RUNTIME_CLASS da classe derivada de
CWinThread
.(Opcional) O nível de prioridade desejado. O padrão é a prioridade normal. Para obter mais informações sobre os níveis de prioridade disponíveis, consulte SetThreadPriority no SDK do Windows.
(Opcional) O tamanho de pilha desejado para o thread. O padrão é a mesma pilha de tamanho que o thread de criação.
(Opcional) CREATE_SUSPENDED se você quiser que o thread seja criado em um estado suspenso. O padrão é 0, ou iniciar o thread normalmente.
(Opcional) Os atributos de segurança desejados. O padrão é o mesmo acesso que o thread pai. Para obter mais informações sobre o formato dessas informações de segurança, consulte SECURITY_ATTRIBUTES no SDK do Windows.
AfxBeginThread
executa a maior parte do trabalho para você. Ele cria um novo objeto de sua classe, inicializa-o com as informações fornecidas e chama CWinThread::CreateThread para começar a executar o thread. São feitas verificações em todo o procedimento para garantir que todos os objetos sejam desalocados corretamente caso qualquer parte da criação falhe.