Delphi EOutOfResources (GDIError)

Я написал приложение, в котором иногда нахожу ошибки EOutofResources, вызванные методом GDIError модуля Graphics при сохранении TBitmap32 в поток.

Насколько я знаю, это может происходить из пределов 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.

К тому же эта ошибка время от времени возникает. оно никогда не достигает упомянутых пределов. Как я могу проверить, где проблема? Что вызывает повышение этой ошибки?

Спасибо

2 ответа

Это, вероятно, не ошибка ресурса вообще. Иногда Delphi сообщает об ошибках GDI, которые не могут быть преобразованы в конкретное сообщение об ошибке как нехватка ресурсов. Смотрите реализацию GDIError в Graphics.pas.

Если вы можете воспроизвести это в IDE, лучший способ выяснить, где и почему это происходит, - это включить опцию Use Debug DCUs в настройках компилятора и включить опцию отладчика Stop On Delphi Exceptions при запуске вашего приложения.

Возможно, у вас есть утечка ресурсов и / или памяти.

Нахождение утечек памяти
Если вы используете отладочную версию 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

Удачной охоты.

Другие вопросы по тегам