C++ 为什么ProcessMessages会抛出一个C++;例外?

C++ 为什么ProcessMessages会抛出一个C++;例外?,c++,exception,c++builder,C++,Exception,C++builder,在维护一个旧产品时,我遇到了一个错误,导致屏幕上充满了数百个消息框,上面写着“C++异常”,其他什么都没有。我将问题追溯到以下几行: Application->ProcessMessages(); 我理解此行的目的,即处理消息队列中的所有消息,但我不确定是什么导致了错误 我不是在寻找一个具体的解决方案,但我想知道是否有其他人有这个问题,或者可能知道什么样的情况可能会导致这种情况发生 关闭所有消息框会使应用程序返回正常的预期行为 更新-在进一步搜索之后,我发现错误不一定是ProcessMe

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

Application->ProcessMessages();
我理解此行的目的,即处理消息队列中的所有消息,但我不确定是什么导致了错误

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

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

更新-在进一步搜索之后,我发现错误不一定是ProcessMessages的错误。发生错误的原因是程序正在进行一些密集的计算,实际上内存不足。注释掉ProcessMessages似乎减少了内存消耗,刚好能够顺利完成计算而不会出错。因此,ProcessMessages看起来像是罪魁祸首,但事实并非如此

看起来我有一些重构要做

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


看起来有些调用来自计时器事件,有些调用来自主应用程序执行。这可能是个问题吗?

这听起来肯定像是库的消息处理代码中的应用程序错误,其中包含一个catch-all异常处理程序,该处理程序使用Win32::MessageBox()API显示一条通用消息作为响应。在代码中查找字符串“C++异常”,并查看它是否位于
catch(…)
catch(std::Exception&)
或类似的处理程序中。有可能他们使用的是Win32

优选地,您应该在VisualStudio调试器下运行程序,使用Debug ->异常对话框设置,以捕获在它们被抛出时而不是未处理的C++异常。这样,您将立即找到生成异常的站点


如果无法在调试器下运行,则可能必须使用
\uuuuu LINE\uuuuuu
\uuuu FILE\uuuuuu
C宏自定义未处理的异常处理程序,以便至少可以找到生成错误的方法。从显示消息框切换到Win32的API,并使用类似于监视调试字符串的工具。

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

优选地,您应该在VisualStudio调试器下运行程序,使用Debug ->异常对话框设置,以捕获在它们被抛出时而不是未处理的C++异常。这样,您将立即找到生成异常的站点


如果无法在调试器下运行,则可能必须使用
\uuuuu LINE\uuuuuu
\uuuu FILE\uuuuuu
C宏自定义未处理的异常处理程序,以便至少可以找到生成错误的方法。从显示消息框切换到Win32的API,并使用类似于监视调试字符串的工具。

这主要是一个猜测,但据我所见,这是一个由大量返回消息日志引起的问题。在大型计算过程中,当大量消息被抛出队列(其中许多是计时器事件)时,应用程序会在几秒钟内失去响应。当计算完成并调用ProcessMessages时,应用程序会被太多的消息淹没,并且分派它们都会导致内存溢出。如果我在计算的每几次迭代之后添加ProcessMessages,以便在事件发生时进行调度,则内存消耗保持不变


听起来似乎有道理?

这主要是一个猜测,但据我所见,这是一个由大量邮件备份引起的问题。在大型计算过程中,当大量消息被抛出队列(其中许多是计时器事件)时,应用程序会在几秒钟内失去响应。当计算完成并调用ProcessMessages时,应用程序会被太多的消息淹没,并且分派它们都会导致内存溢出。如果我在计算的每几次迭代之后添加ProcessMessages,以便在事件发生时进行调度,则内存消耗保持不变


听起来有道理吗?

我不确定这是在使用哪个库。它是用Borland C++ Builder构建的,如果它在问题上产生任何光。PuildMeals:是C++ C++ Builder Windows应用程序的一个应用程序类的方法。尝试捕获<代码> STD::运行时错误——如果异常是基于该类,则可以从<代码> E.WHONE()/代码>中获得更多信息。我编辑了标记以反映这一点。我不确定这是使用哪个库。它是用Borland C++ Builder构建的,如果它在问题上产生任何光。ProcessMessages是C++Builder Windows应用程序的TApplication类的一种方法。请尝试捕获
std::runtime\u error
-如果异常基于该类,您可能会从
e.what()
获得更多信息。因为这是一个专门针对Borland部分的问题