ID do artigo: 175332 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 2.1

PROBLEMA: Mensagem de difusão processo causa bloqueio

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.
Expandir tudo | Recolher tudo

Mais Informações

Para receber notificação quando um processo foi encerrado, um aplicativo Win32 pode chamar WaitForSingleObject() e especificar o identificador de processo do aplicativo a ser aguardado. Normalmente, isso fará com que o processo de espera para bloquear até que o aplicativo sendo aguardado termina. Em seguida, WaitForSingleObject() retornará que WAIT_OBJECT_0 e o processo de espera continuará a executar.

Às vezes, aplicativos transmitir mensagens para algumas ou todas as outras janelas no sistema. Nesse caso o método acima fará com que uma situação de deadlock se o aplicativo espera não estiver livre para processar mensagens. Se o aplicativo espera está aguardando no seu segmento que processa as mensagens de janela, em seguida, nenhuma mensagem pode ser processada até que a espera seja concluída. Se o processo aguardado chamadas SendMessage() e transmite uma mensagem para a janela do processo de espera, um deadlock ocorre. O SendMessage() não retornará até que a mensagem é processada, e o processo de espera não pode expedir a mensagem até que sua chamada WaitForSingleObject() retorna. Para obter uma descrição de uma comum OLE manifestação desse problema, consulte o seguinte artigo do Knowledge Base:
136885  (http://support.microsoft.com/kb/136885/EN-US/ ) INFO: OLE segmentos devem enviar mensagens
Para evitar que esse deadlock, o aplicativo espera deve esperar em um thread separado, liberando, portanto, o thread principal para processar mensagens. Quando o processo que estiver sendo aguardado conclui e WaitForSingleObject() retorna, o segmento em espera pode notificar o segmento principal enviando uma mensagem definida pelo usuário para a fila de mensagens da janela principal. O thread principal interpretará a mensagem definida pelo usuário como conclusão do processo esperava em de. Para obter mais informações sobre mensagens definidas pelo usuário, consulte o seguinte artigo do Knowledge Base:
86835  (http://support.microsoft.com/kb/86835/EN-US/ ) COMO: Definir mensagens privadas para uso do aplicativo
Outra maneira de evitar esse problema é ter o segmento em espera chamar MsgWaitForMultipleObjects() em um loop, chama DispachMessage() quando uma mensagem precisa ser processada. Para obter um exemplo dessa técnica consulte o artigo do Knowledge Base mencionado acima, o problema de OLE (Q136885).

Sintomas

Um deadlock ocorre quando um processo de espera no identificador de outro processo que transmite uma mensagem.

Causa

Isso ocorre quando o processo de espera está aguardando no segmento que processa as mensagens enviadas para a janela (a janela principal do thread).

Resolução

Para evitar essa situação deadlock pode esperar o processo de espera em um thread separado, deixando o thread da janela principal livre para processar mensagens de janela ou use a API MsgWaitForMultipleObjects() em conjunto com as mensagens de expedição.

A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 nas seguintes plataformas
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
Palavras-chave: 
kbmt kbinfo KB175332 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: 175332  (http://support.microsoft.com/kb/175332/en-us/ )