As mensagens do Windows manutenção enquanto a caixa de diálogo afirmam está sendo exibida?

StackOverflow https://stackoverflow.com/questions/1454058

  •  12-09-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo MFC que gera vários threads de trabalhadores diferentes e é compilado com o VS2003.

Ao ligar para CtreectRl :: getItemState (), ocasionalmente, estou recebendo um pop -up de diálogo de afirmação de depuração. Suponho que isso seja porque eu passei em uma alça para um item inválido, mas essa não é minha preocupação imediata.

Minha preocupação é: a partir dos meus logs, parece que o thread MFC continua a atender a várias mensagens do Windows enquanto a caixa de diálogo Assert está sendo exibida. Eu pensei que a caixa de diálogo assert era modal, então eu queria saber se isso era possível?

Foi útil?

Solução

A caixa de mensagens que mostra a falha de asserção possui uma bomba de mensagens para seus próprios fins. Mas será enviado todas as mensagens que entram, não apenas as da caixa de mensagens (caso contrário, as coisas poderiam ser bloqueadas).

Com uma caixa de diálogo modal normal, isso não é um problema, porque a janela dos pais normalmente é desativada durante a caixa de diálogo.

O código que inicia a caixa de diálogo Asserção deve ter falhado em descobrir a janela dos pais e, portanto, não foi desativado. Isso pode acontecer se sua janela principal não for a janela ativa no momento da afirmação. Outras coisas também podem dar errado.

Você pode alterar como o C Library de tempo de execução do Visual Studio relata falhas de afirmação com _CrtSetReportMode. Você pode fazer com que ele pare no depurador e/ou log na janela de saída em vez de tentar mostrar a caixa de diálogo.

Outras dicas

Os diálogos (mesmo uma caixa de mensagem) precisam bombear a fila de mensagens, mesmo que sejam modais. Caso contrário, como eles saberiam que você clicou no botão "OK"?

Se você precisar parar tudo quando uma afirmação desencadeia, geralmente não é muito difícil escrever sua própria implementação de assert() (ou ASSERT() ou o que quer que seja) que entrará no depurador em vez de exibir uma caixa de mensagem que pergunta se você deseja entrar no depurador (talvez apenas se determinar que o depurador está anexado).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top