MFC应用程序中的奇怪控制显示损坏

时间:2012-11-06 15:45:12

标签: c++ visual-studio-2010 mfc corruption

我有一个奇怪的问题,我一直无法诊断,我希望有人能够至少指出我正确的方向。我有一个C ++ MFC应用程序,它从各种来源收集数据并将其显示在屏幕上。然而,在随机间隔(通常约5-10分钟)之后,显示器以我从未见过的方式“被破坏”或者能够跟踪,如下图所示(左边是正常的,右边是腐败的) ):

Example of Display Corruption

基本症状是:

  • 上/下箭头图像变为“5”和“6”。
  • 打开组合框列表只会显示项目文本(不显示列表边框和滚动条)。
  • 某些控件上的背景颜色无法正确更新或显示。
  • Z顺序被破坏,应用程序通过放在顶部的其他窗口控制“泄漏”。
  • 使用对焦的应用程序按Print-Screen不再将窗口捕获到剪贴板。
  • 关闭并重新打开窗口无效。
  • 重新启动应用程序可以恢复正常。

我试图消除的可能原因包括:

  • 操作系统&计算机:从Windows 7-64位到Windows Xp-32位的各种系统都存在同样的问题。
  • 多线程:我添加了一个互斥锁,以防止显示更新同时发生,但它没有效果(正如预期的那样)。
  • 内存腐败:这一直是我的假设,但根本没有内存损坏的迹象。基本显示代码已使用多年,没有类似的问题以及基本网络消息库。
  • 特定代码:我已将问题范围缩小到一系列显示无问题的特定对话框。它们都使用相同的基本代码,这似乎表明问题在于对话框的特定显示代码。到目前为止,究竟是如何或为何出现这个问题一直未能实现。

关于原因可能是什么或如何缩小范围的任何想法都会很棒。

更新1: 做一些更多的定时/可重复测试,看起来让这个对话框运行一会儿会导致问题。在问题出现之前,金额时间始终在300-400秒之间。

2 个答案:

答案 0 :(得分:1)

听起来你的应用程序可能正在泄漏GDI对象。要检查是否是这种情况,请打开任务管理器并启用GDI Objects列。观察过程的编号,看它是否在不断增加。

如果确实如此,您应该阅读Detect and Plug GDI Leaks in Your Code with Two Powerful Tools for Windows XP。该MSDN文章还提供了一个名为GDILeaks.exe的工具,可以帮助您识别GDI泄漏。

如果这些症状在短时间内浮出水面,那么它应该是反复绘制的,不能正确释放GDI资源。可能在(或在其中)窗口过程(例如OnPaint)。

答案 1 :(得分:0)

如果我没弄错,Windows的GUI会对这些小图标使用ttf(?)字体,看起来字体会以某种方式被破坏(使用字体的句柄调用DeleteObject?)