0

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

显示损坏示例

基本症状是:

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

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

  • 操作系统和计算机:从 Windows 7-64 位到 Windows Xp-32 位的各种系统都存在同样的问题。
  • 多线程:我添加了一个互斥锁以防止同时发生显示更新,但它没有效果(如预期的那样)。
  • 内存损坏:这一直是我的假设,但根本没有内存损坏的迹象。基本显示代码已使用多年,没有类似问题以及基本网络消息库。
  • 特定代码:我已将问题缩小到一个特定对话中的各种其他显示没有问题的对话。它们都使用相同的基本代码,这似乎表明问题在于对话框的特定显示代码。到目前为止,问题发生的具体方式或原因一直困扰着我。

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

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

4

2 回答 2

1

听起来您的应用程序可能正在泄漏 GDI 对象。要检查是否是这种情况,请打开您的任务管理器并启用该GDI Objects列。观察您的流程的数字,看看它是否在持续增加。

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

在这些症状在短时间内出现的情况下,应该是重复绘制的东西没有正确释放 GDI 资源。可能在 Windows 过程中(或在其中调用)(例如 OnPaint)。

于 2012-11-06T17:47:18.107 回答
0

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

于 2012-11-06T16:08:47.793 回答