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