2009-09-21 93 views
1

我有一个MFC应用程序,产生了许多不同的工作线程,并与VS2003编译。正在显示断言对话框时处理Windows消息?

当调用CTreeCtrl :: GetItemState()我偶尔会得到一个调试断言对话框弹出。我假设这是因为我已经通过了一个无效项目的句柄,但这不是我的直接担忧。

我的问题是:从我的日志中,看起来好像MFC线程继续在显示断言对话框时服务多个Windows消息。我认为assert对话框是模态的,所以我想知道这是甚至可能吗?

+0

你确定你没有看到其他线程处理线程消息吗? – 2009-09-21 12:14:15

+0

我的日志包含线程ID,它似乎是服务On ***消息并调用GetItemState() – 2009-09-21 12:38:53

回答

2

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

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

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

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

+0

的同一线程感谢您的解释,这听起来完全合理。 我喜欢使用_CrtSetReportMode让软件做一些比抛出一个对话框更好的想法,但不幸的是它运行在没有安装Visual Studio的独立PC上。 – 2009-09-23 12:53:49

+0

我认为这是在你的开发机器上,因为你已经启用了断言。 – 2009-09-23 17:12:53

2

对话框(即使是消息框)也需要抽取消息队列,即使它们是模态的。否则他们会如何知道您点击了“确定”按钮?

如果您需要时断言触发它通常不是太难写自己实现assert()(或ASSERT()或其他)如果你想打破这将中断到调试而不是显示询问一​​个消息的停止一切到调试器(也许只有当它确定调试器被连接时)。