在WindowProc MFC中使用try / catch

时间:2009-06-18 10:11:01

标签: c++ mfc

如果我在WindowProc覆盖MFC窗口/视图类中使用try / catch,则会有性能损失。为什么会这样?又有什么选择?

这是我在剖析中捕获到的。删除块会使功能消耗更少的时间。我正在使用MS VS 2008。

5 个答案:

答案 0 :(得分:2)

只使用try / catch不会产生性能损失 - 也许你会抛出太多异常?您是否已分析过您的代码以找出性能影响的来源?

答案 1 :(得分:1)

usage-of-try-catch-blocks-in-c中,Todd Gardner解释说,编译器使用“表”方法或“代码”方法来实现异常。 “代码”方法解释了性能损失。

答案 2 :(得分:1)

另一种方法是将try-catch放在你自己的代码周围。对WndProc的大多数调用都以DefaultWindowProc *结束,而不会抛出C ++异常。因此,通过将try / catch移近您自己的代码,可以节省大量开销。

[*] DefaultWindowProc可能抛出SEH异常,例如增加堆栈,但你不应该处理它们。

答案 3 :(得分:0)

我确信你知道WindowProc会处理很多流量。每个通过泵的消息都会执行开关(消息)循环之外的任何代码。

我刚刚创建了一个基于MFC应用程序的小对话框,我在其中覆盖了WindowProc并简单地计算它被调用的次数。测试表明,只需将鼠标光标移动到对话框上,每秒就会产生超过1000个WindowProc调用。

只需要考虑一下。

P.S。我会将此添加为评论,但我还没有足够的声誉评分。

答案 4 :(得分:0)

在您的app类中,请查看覆盖CWinApp::ProcessWndProcException。这使您有机会在任何命令或消息处理程序中引发未被捕获的MFC CException s(和衍生物)。

如果你需要最后一次机会,你需要考虑安装自己的SEH过滤器。