我有一个MFC应用程序,它生成了许多不同的工作线程,并使用VS2003进行编译。
当调用CTreeCtrl :: GetItemState()时,我偶尔会得到一个调试断言对话框弹出窗口。我假设这是因为我已经传递了一个无效项目的句柄,但这不是我直接关注的问题。
我担心的是:从我的日志开始,看起来好像MFC线程在显示断言对话框时继续为许多窗口消息提供服务。我认为断言对话框是模态的,所以我想知道这是否可能?
答案 0 :(得分:3)
显示断言失败的消息框有一个用于其自身目的的消息泵。但它会发送所有进来的消息,而不仅仅是消息框的消息(否则可能会被阻止)。
使用普通的模态对话框,这不是问题,因为父窗口通常在对话期间被禁用。
启动断言对话框的代码必须无法找出父窗口,因此未禁用它。如果主窗口在断言时不是活动窗口,则会发生这种情况。其他事情也可能出错。
您可以更改Visual Studio的C运行时库如何使用_CrtSetReportMode报告断言失败。您可以使其在调试器中停止和/或登录到输出窗口,而不是尝试显示对话框。
答案 1 :(得分:2)
对话框(甚至是消息框)需要抽取消息队列,即使它们是模态的。否则他们怎么知道你点击了“确定”按钮?
如果你需要在一个断言触发时停止一切,那么编写你自己的assert()
(或ASSERT()
或其他)的实现通常不会太困难,这些实现会进入调试器而不是显示消息框询问您是否要进入调试器(可能只有在确定调试器已连接时)。