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.

Que mais você deseja saber?

Confira também

Multithreading com C++ e MFC