CORRECÇÃO: EXE ATL Server com base em CComAutoThreadModule pode bloqueio no registo

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.

202128
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Sintomas
Um servidor ATL EXE baseado CComAutoThreadModule <> pode deixar de responder quando a ser registado ou registo anulado.
Causa
CComAutoThreadModule<>::Init() chamado na WinMain() cria um conjunto de threads (por predefinição 4 threads). O processo de destruição de CComAutoThreadModule global torna determinado que estes threads terminar antes que termine o processo. Isto acontece, colocando uma mensagem WM_QUIT para cada um dos threads no conjunto de threads e chamar WaitForSingleObject() no identificador de thread. Os threads são agendados que os threads no conjunto de não ter chamado GetMessage() e para a fila de mensagem não é criada. Isto faz com que o PostThreadMessage() falha. Por conseguinte, os threads no conjunto de não terminar e WaitForSingleObject() infinitamente aguarda threads para terminar.
Resolução
No ficheiro Altcom.h, dentro do directório de vc98\atl\include do processo de destruição na função CComAutoThreadModule substitua o seguinte código:
   ::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT, 0, 0);				

com este código:
   while (::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT,      0, 0) == 0) ::Sleep(100);				
Ponto Da Situação
A Microsoft confirmou que este erro ocorre nos produtos da Microsoft listados no início deste artigo.

Este problema foi corrigido no Microsoft Visual C++. NET.
Mais Informação
  1. Utilize Appwizard para criar um ATL EXE .
  2. Inserir qualquer tipo de objecto ATL no projecto.
  3. Nos Stdafx.h, substitua CComModule CComAutoThreadModule<ccomsimplethreadallocator>.
  4. Crie o projecto.

    Nota : é possível que o servidor poderá não reagir neste momento uma vez que o passo de compilação personalizado regista o servidor.
  5. No menu Project definições em tipo de separador de depuração " / RegServer " na caixa de diálogo Argumentos de programa .
  6. Execute o servidor no depurador.

    Nota : se que não terminar ligação pela primeira vez, repita este passo. Uma vez que este é relacionados com a temporização, o problema não poderá reproduzir em determinados computadores.
kbDSupport

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 202128 - Última Revisão: 01/06/2015 04:07:20 - Revisão: 2.0

  • Microsoft ActiveX Template Library 3.0
  • kbnosurvey kbarchive kbmt kbbug kbfix kblocalsvr kbthread KB202128 KbMtpt
Esta informação foi útil?