德尔福EOutOfResources(GDIError)

问题描述:

我写了一个应用程序,其中我发现在将TBitmap32保存到流时,由Graphics单元的GDIError方法引发的偶发EOutofResources错误 。德尔福EOutOfResources(GDIError)

据我所知,它可能来自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 
------------------------------------------------------------- 

正如上面我只用44%的桌面堆在winsta0中。

此外,此错误不时引发。它永远达不到上述限制。 我如何检查问题出在哪里?是什么导致了这个错误?

谢谢

+0

也许你正在泄漏位图句柄? – 2011-05-18 14:32:41

+2

我认为你应该发布相关的代码。 – Sam 2011-05-19 03:04:20

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

查找内存泄漏
如果使用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

好猎手。

这可能不是资源错误。有时Delphi会报告无法将GDI错误转换为特定错误消息的资源外。在Graphics.pas中查看GDIError的实现。

如果你可以在IDE中重现这一点,找出发生在何处/为什么的最好方法可能是在编译器设置中启用Use Debug DCUs选项,并在运行时启用Stop On Delphi Exceptions调试器选项应用程序。

+0

'不能翻译'(或:那太无聊了翻译),如[本答案](http://*.com/a/2181633/2932052)中所述, – Wolf 2015-01-27 15:26:34