2011-05-18 64 views
3

我寫了一個應用程序,其中我發現在將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

回答

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

好獵手。

2

這可能不是資源錯誤。有時Delphi會報告無法將GDI錯誤轉換爲特定錯誤消息的資源外。在Graphics.pas中查看GDIError的實現。

如果你可以在IDE中重現這一點,找出發生在何處/爲什麼的最好方法可能是在編譯器設置中啓用Use Debug DCUs選項,並在運行時啓用Stop On Delphi Exceptions調試器選項應用程序。

+0

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