正在显示断言对话框时服务的Windows消息?

时间:2009-09-21 11:30:24

标签: c++ mfc windows-messages

我有一个MFC应用程序,它生成了许多不同的工作线程,并使用VS2003进行编译。

当调用CTreeCtrl :: GetItemState()时,我偶尔会得到一个调试断言对话框弹出窗口。我假设这是因为我已经传递了一个无效项目的句柄,但这不是我直接关注的问题。

我担心的是:从我的日志开始,看起来好像MFC线程在显示断言对话框时继续为许多窗口消息提供服务。我认为断言对话框是模态的,所以我想知道这是否可能?

2 个答案:

答案 0 :(得分:3)

显示断言失败的消息框有一个用于其自身目的的消息泵。但它会发送所有进来的消息,而不仅仅是消息框的消息(否则可能会被阻止)。

使用普通的模态对话框,这不是问题,因为父窗口通常在对话期间被禁用。

启动断言对话框的代码必须无法找出父窗口,因此未禁用它。如果主窗口在断言时不是活动窗口,则会发生这种情况。其他事情也可能出错。

您可以更改Visual Studio的C运行时库如何使用_CrtSetReportMode报告断言失败。您可以使其在调试器中停止和/或登录到输出窗口,而不是尝试显示对话框。

答案 1 :(得分:2)

对话框(甚至是消息框)需要抽取消息队列,即使它们是模态的。否则他们怎么知道你点击了“确定”按钮?

如果你需要在一个断言触发时停止一切,那么编写你自己的assert()(或ASSERT()或其他)的实现通常不会太困难,这些实现会进入调试器而不是显示消息框询问您是否要进入调试器(可能只有在确定调试器已连接时)。