gpt4 book ai didi

c++ - 为什么 ProcessMessages 会抛出 C++ 异常?

转载 作者:行者123 更新时间:2023-11-30 04:38:08 27 4
gpt4 key购买 nike

在维护旧产品时,我遇到了一个错误,该错误导致屏幕上充满了数百个消息框,上面写着“C++ 异常”,没有其他任何内容。我将问题追溯到以下行:

Application->ProcessMessages();

我明白这一行的目的,处理消息队列中的所有消息,但我不确定是什么导致了错误。

我不是在寻找特定的解决方案,但我想知道是否还有其他人遇到过这个问题,或者可能知道什么样的情况可能会导致这种情况发生。

关闭所有消息框会导致应用程序返回正常的预期行为。

更新 - 经过更多搜索,我发现错误不一定是 ProcessMessages 的错误。出现这些错误是因为程序正在进行一些密集计算,实际上内存不足。似乎注释掉 ProcessMessages 减少了内存消耗,足以让计算无误地完成。因此,ProcessMessages 看起来像是罪魁祸首,但实际上并非如此。

看来我有一些重构要做。

更新 2 - 三天后,我得出的结论是只有在调用 ProcessMessages 时才会发生错误。如果我评论所有对 ProcessMessages 的调用(令我沮丧的是,有很多),那么应用程序运行良好,但内存消耗恒定,这意味着密集计算不会占用内存。取消注释调用会导致内存再次飙升到错误点。所以最初的问题是:为什么 ProcessMessages 会导致这个错误?

看起来有些调用是从计时器事件中发出的,而另一些是从主应用程序执行中发出的。这可能是个问题吗?

最佳答案

这听起来确实像是库的消息处理代码中的应用程序错误,其中包含一个捕获所有异常处理程序,该处理程序使用 Win32::MessageBox() API 作为响应显示通用消息。在代码中查找字符串“C++ Exception”,看看它是否在 catch(...)catch (std::exception&) 或类似的处理程序中。他们可能正在使用 Win32 unhandled exception filter相反。

您最好在 Visual Studio 调试器下运行程序,并设置“调试”->“异常”对话框以在抛出异常时捕获 C++ 异常,而不是在异常未处理时捕获它们。这样您就可以立即找到生成异常的网站。

如果您不能在调试器下运行,您可能必须使用 __LINE____FILE__ C 宏自定义未处理的异常处理程序,这样您至少可以找出什么方法产生错误。从显示消息框切换到 Win32 的 OutputDebugString() API并使用像DebugView这样的工具观看调试字符串。

关于c++ - 为什么 ProcessMessages 会抛出 C++ 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3336261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com