我有一个MFC应用程序,可产生许多不同的工作线程,并使用VS2003编译。

在调用ctreectrl :: getitemstate()时,我偶尔会获得一个调试断言对话框弹出窗口。我假设这是因为我已经传递了无效项目的处理方法,但这并不是我的直接问题。

我关心的是:从我的日志中,看起来MFC线程在显示“断言”对话框时继续为许多Windows消息提供服务。我认为断言对话是模态,所以我想知道这是否可能吗?

有帮助吗?

解决方案

显示断言失败的消息框有一个消息泵出于其自身目的。但是,它将派遣所有消息,而不仅仅是消息框的消息(否则情况可能会被阻止)。

使用正常的模态对话框,这不是问题,因为对话框的持续时间通常会禁用父窗口。

启动“断言”对话框的代码一定无法弄清楚父窗口,因此并未禁用。如果您的主窗口在断言时不是主动窗口,则可能发生这种情况。其他事情也可能出错。

您可以更改Visual Studio的C运行时间库报告主张失败的方式 _CRTSETREPORTMODE. 。您可以使其停止在调试器中和/或登录到输出窗口,而不是尝试显示对话框。

其他提示

对话框(甚至是消息框)也需要泵送消息队列,即使它们模态也是如此。否则,他们将如何知道您单击“确定”按钮?

如果您需要在断言触发时停止一切,通常不太难以编写自己的实现 assert() (或者 ASSERT() 或其他)将闯入调试器而不是显示询问您是否要闯入调试器的消息框(也许只有确定附加调试器的情况下)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top