3

我编写了一个应用程序,在将 TBitmap32 保存到流时,偶尔会发现 Graphics 单元的 GD​​IError 方法引发的 EOutofResources 错误。

据我所知,它可能来自 gdi 限制或堆限制。我知道对于该过程,默认限制为 10000 个句柄。所以我的应用程序根据任务管理器报告只有 620。

我已经下载并运行了桌面堆信息监控工具,它报告了这个:

Desktop Heap Information Monitor Tool (Version 8.1.2925.0)
Copyright (c) Microsoft Corporation.  All rights reserved.
-------------------------------------------------------------
  Session ID:    0 Total Desktop: (  7360 KB -   11 desktops)

  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
  WinSta0\Default                    3072             44.5
  WinSta0\Disconnect                   64              4.5
  WinSta0\Winlogon                    128             10.2
  Service-0x0-3e7$\Default            512             29.1
  Service-0x0-3e4$\Default            512              6.8
  Service-0x0-3e5$\Default            512              6.8
  SAWinSta\SADesktop                  512              0.5
  __X78B95_89_IW\__A8D9S1_42_ID       512              0.5
  Service-0x0-1ae39$\Default          512              2.4
  Service-0x0-12d284a7$\Default       512              2.5
  Service-0x0-1312b6d4$\Default       512             15.0
-------------------------------------------------------------

如上所述,我只使用了 winsta0 中 44% 的桌面堆。

此外,此错误会不时引发。它从未达到提到的限制。我如何检查问题出在哪里?是什么导致引发此错误?

谢谢

4

2 回答 2

2

您可能有资源和/或内存泄漏。

查找内存泄漏
如果您使用 FastMM 的调试版本,它会在您的程序关闭时向您显示内存泄漏报告。

以下文章应该可以帮助您:
http ://wiert.wordpress.com/2009/07/29/delphi-fastmm-using-fastmm4-for-debugging-your-memory-allocations-part-1-introduction/

查找资源泄漏请注意,FastMM 虽然是查找内存泄漏
的重要工具,但不会查找资源泄漏。 AQTime 可以找到这些,它有 30 天的试用期。查看:http ://smartbear.com/products/development-tools/performance-profiling/

如果您想要一个开源资源泄漏工具,请尝试:http ://www.kbasm.com/denomo.html

很好的狩猎。

于 2011-05-18T19:27:38.140 回答
2

这可能根本不是资源错误。有时 Delphi 会将无法转换为特定错误消息的 GDI 错误报告为资源不足。请参阅 Graphics.pas 中 GDIError 的实现。

如果您可以在 IDE 中重现此问题,找出它发生的位置/原因的最佳方法可能是在编译器设置中启用 Use Debug DCUs 选项,并在运行您的应用程序时启用 Stop On Delphi Exceptions 调试器选项。

于 2011-05-18T20:27:45.790 回答