Artigo: 175332 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 2.1

PROBLEMA: Mensagem de difusão de processo devido a bloqueio total

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 | Reduzir tudo

Mais Informação

Para receber notificação quando um processo terminou, uma aplicação de Win32 pode chamar WaitForSingleObject() e especificar o identificador de processo da aplicação a ser aguardado. Normalmente, Isto fará com que o processo de espera para bloquear até que a aplicação a ser aguardada terminar. Em seguida, WaitForSingleObject() devolverá que WAIT_OBJECT_0 e o processo em espera vão continuar a executar.

Por vezes, aplicações de mensagens de difusão para algumas ou todas as outras janelas no sistema. Neste caso o método acima irá provocar uma situação de impasse se a aplicação em espera não está livre para processar mensagens. Se a aplicação em espera está à espera do thread que processa mensagens de janela, em seguida, não existem mensagens podem ser processadas até que o tempo de espera seja concluído. Se o processo aguardado chamadas SendMessage() e difunde uma mensagem para a janela do processo de espera, um impasse resulta. Não irá devolver o SendMessage() até a mensagem é processada e o processo de espera não é possível de envio a mensagem até que a chamada WaitForSingleObject() devolve. Para uma descrição de um comum OLE manifestation deste problema, consulte o seguinte artigo da base de dados de conhecimento:
136885  (http://support.microsoft.com/kb/136885/EN-US/ ) INFO: OLE threads tem de despacho mensagens
Para impedir que este impasse, deve esperar que a aplicação em espera num thread separado, assim como libertar o thread principal para mensagens de processo. Quando o processo que está a ser aguardado conclui e WaitForSingleObject() devolve, o thread em espera pode notificar o thread principal enviando uma mensagem definida pelo utilizador para a fila da janela principal. O thread principal interpretarão mensagem definidos pelo utilizador como a conclusão do processo aguardado no. Para mais informações sobre mensagens definidos pelo utilizador, consulte o seguinte artigo da base de dados de conhecimento:
86835  (http://support.microsoft.com/kb/86835/EN-US/ ) COMO: Definir mensagens privadas para utilização de aplicações
Outra forma de evitar este problema é ter o thread de espera de chamada MsgWaitForMultipleObjects() num ciclo, que chama DispachMessage() quando uma mensagem necessita de ser processado. Para obter um exemplo desta técnica consulte o artigo da base de dados de conhecimento da referida acima sobre o problema OLE (Q136885).

Sintomas

Um impasse ocorre quando um processo aguarda no identificador de outro processo que difunde uma mensagem.

Causa

Isto ocorre quando o processo em espera está à espera num thread que processa as mensagens enviadas para a janela (o thread de janela).

Resolução

Para evitar esta situação impasse pode aguardar o processo em espera num thread separado, deixando o thread de janela livre para processar mensagens de janela ou utilizar a API MsgWaitForMultipleObjects() em conjunto com as mensagens de emissão.

A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )