ID do artigo: 951322 - Última revisão: quarta-feira, 30 de abril de 2008 - Revisão: 1.0

A função WaitForMultipleObjects() não funciona corretamente com pseudohandles no Windows XP, no Windows Server 2003 ou no Windows Vista

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

Sintomas

A função WaitForMultipleObjects() não funciona corretamente em conjunto com pseudohandles no Windows XP, no Windows Server 2003 ou no Windows Vista.

Considere o seguinte código exemplo.
int _tmain(int argc, _TCHAR* argv[])
{
      
      HANDLE hnd[1]; 
	long res; 
	hnd[0] = GetCurrentProcess(); 

        res = WaitForMultipleObjects(1, hnd, FALSE, 3000);
      return 0;
}
após você executar o código exemplo, você espera que a função retornar após três segundos. No entanto, ele retorna um erro de "WAIT_FAILED", e não espera.

Como Contornar

Para contornar esse problema, use a função DuplicateHandle() para converter os pseudohandles em um identificador de processo real.

Por exemplo, usar o seguinte código de exemplo.
int _tmain(int argc, _TCHAR* argv[])
{
      
      HANDLE hnd[1]={0};
      long res; 
      HANDLE Threadhandle = ::GetCurrentThread();
      
      DuplicateHandle(GetCurrentProcess(), Threadhandle, 
      GetCurrentProcess(),
      &hnd[0], 
      0,
      FALSE,
      DUPLICATE_SAME_ACCESS);

      res = WaitForMultipleObjects(1, hnd, TRUE, 10000);

      return 0;
}

Mais Informações

Esse problema ocorre porque o pseudohandle é uma constante especial que é interpretada como o segmento atual ou o identificador de processo. O thread de chamada pode usar este identificador para especificar se quando um identificador de segmento é necessário. Essas alças não podem ser chamadas por outros threads. Um pseudohandle sempre é interpretado como referência ao thread que está usando.

O pseudohandle não precisa ser fechado quando ele não é mais necessária. Chamar a função CloseHandle() para este identificador tem efeito.

Um processo usa a função GetCurrentProcess() ou a função GetCurrentHandle() para obter um identificador para si mesmo. Esse identificador é um pseudohandle. No entanto, a função DuplicateHandle() converte-lo em um identificador de processo real.

A informação contida neste artigo aplica-se a:
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard x64 Edition
  • Microsoft Windows Server 2003, Enterprise x64 Edition
  • Microsoft Windows Server 2003, Datacenter x64 Edition
  • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
  • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
  • Microsoft Windows XP Professional
  • Microsoft Windows XP Home Edition
  • Windows Vista Business
  • Windows Vista Enterprise
  • Windows Vista Home Basic
  • Windows Vista Home Premium
  • Windows Vista Ultimate
  • Windows Vista Business 64-bit edition
  • Windows Vista Enterprise 64-bit edition
  • Windows Vista Home Basic 64-bit edition
  • Windows Vista Home Premium 64-bit edition
  • Windows Vista Ultimate 64-bit edition
Palavras-chave: 
kbmt kbexpertiseinter kbtshoot kbprb KB951322 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: 951322  (http://support.microsoft.com/kb/951322/en-us/ )