ID do artigo: 142415 - Última revisão: terça-feira, 9 de dezembro de 2003 - Revisão: 2.0

PROBLEMA: Manipulador de mensagens MFC não é chamado com PostThreadMessage()

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sintomas

Quando o código usa a função Win32 PostThreadMessage(), os manipuladores de mensagem do MFC não são chamados.

Causa

Quando você chamar PostThreadMessage(), a mensagem é colocada na fila de mensagens do thread. No entanto, porque as mensagens postadas dessa maneira não estão associadas a uma janela, MFC será não distribui-los para manipuladores de mensagem ou o comando. Para lidar com essas mensagens, substituir a função PreTranslateMessage() de sua classe derivada de CWinApp e manipular as mensagens manualmente.

Resolução

O código a seguir demonstra como chamar PostThreadMessage() InitInstance() da classe derivada de CWinApp usando um aplicativo single-threaded. O princípio é o mesmo para segmentos secundários, exceto que o código mostrado aqui deve ser colocado em sua classe derivada de CWinThread alternativo.

O Visual C++ 4.2 dá suporte a tratamento de mensagens postadas para segmentos. Para obter mais informações, consulte ON_THREAD_MESSAGE na documentação do Visual C++ 4.2.

Observação : MFC threads de trabalho não tem uma loop/bomba de mensagem associada a eles para que você deve usar um thread de interface do usuário.

Código de exemplo

/* Compile options needed:

   standard MFC project generated by AppWizard */ 

BOOL CThreadMsgApp::PreTranslateMessage(MSG* pMsg)
{
    // Is it the Message you want?
    // You can use a switch statement but because this is
    // only looking for one message, you can use the if/else
    if (pMsg->message == WM_USER+2268)
    {
        // Call the function to handle this message
   OnReceivedCommand(pMsg->wParam,pMsg->lParam);
        // Tell MFC no more processing is needed
        return TRUE;
    }
    else
        // Call MFC to have it continue processing the message
        return CWinThread::PreTranslateMessage(pMsg);
}

BOOL CThreadMsgApp::InitInstance()
{
    WPARAM wParam;
    LPARAM lParam;
    wParam = MAKEWPARAM(0,0); // We can put whatever we
    lParam = MAKELPARAM(0,0); // want in wParam & lParam

    // Send the user-defined Thread Message
    // m_nThreadID is a member of CWinThread that holds the thread ID
    PostThreadMessage(m_nThreadID, WM_USER+2268, wParam, lParam);

    return TRUE;
}

void CThreadMsgApp::OnReceivedCommand(WPARAM wParam, LPARAM lParam)
{
    // You can do whatever you want in here, this is simply
    // sending output to the debug window
    TRACE0("Received WM_USER+2268!!\n");
}
				

Referências

Para obter mais informações sobre o objeto CWinThread, consulte o seguinte: MFC enciclopédia, multithreading: Criando segmentos de interface do usuário.

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
Palavras-chave: 
kbmt kbprb kbthread KB142415 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 142415  (http://support.microsoft.com/kb/142415/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.