Windows消息服务在显示自称对话框的同时?
-
12-09-2019 - |
题
我有一个MFC应用程序,可产生许多不同的工作线程,并使用VS2003编译。
在调用ctreectrl :: getitemstate()时,我偶尔会获得一个调试断言对话框弹出窗口。我假设这是因为我已经传递了无效项目的处理方法,但这并不是我的直接问题。
我关心的是:从我的日志中,看起来MFC线程在显示“断言”对话框时继续为许多Windows消息提供服务。我认为断言对话是模态,所以我想知道这是否可能吗?
解决方案
显示断言失败的消息框有一个消息泵出于其自身目的。但是,它将派遣所有消息,而不仅仅是消息框的消息(否则情况可能会被阻止)。
使用正常的模态对话框,这不是问题,因为对话框的持续时间通常会禁用父窗口。
启动“断言”对话框的代码一定无法弄清楚父窗口,因此并未禁用。如果您的主窗口在断言时不是主动窗口,则可能发生这种情况。其他事情也可能出错。
您可以更改Visual Studio的C运行时间库报告主张失败的方式 _CRTSETREPORTMODE. 。您可以使其停止在调试器中和/或登录到输出窗口,而不是尝试显示对话框。
其他提示
对话框(甚至是消息框)也需要泵送消息队列,即使它们模态也是如此。否则,他们将如何知道您单击“确定”按钮?
如果您需要在断言触发时停止一切,通常不太难以编写自己的实现 assert()
(或者 ASSERT()
或其他)将闯入调试器而不是显示询问您是否要闯入调试器的消息框(也许只有确定附加调试器的情况下)。
不隶属于 StackOverflow