System.OutOfMemoryException: недостаточно памяти (GDI) - PullRequest
2 голосов
/ 21 апреля 2009

После установки моей программы на Windows Vista Premium я получаю следующее исключение.

Отображаемое представление содержит следующие элементы управления: 2 текстовых поля, 3 надписи, кнопка и кнопка ссылки.

System.OutOfMemoryException: Out of memory.
   at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc)
   at System.Windows.Forms.PaintEventArgs.get_Graphics()
   at System.Windows.Forms.Control.PaintException(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.OnPrint(PaintEventArgs e)
   at System.Windows.Forms.Control.WmPrintClient(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

У кого-нибудь была такая же проблема? Как это решить?

Ответы [ 4 ]

4 голосов
/ 05 июля 2010

Это не обязательно ошибка OOM, GDI имеет привычку выбрасывать из памяти всякий раз, когда выдает исключение.

По словам Microsoft, «GDI + любит возвращать исключения OutOfMemoryException в случаях, которые не имеют ничего общего с памятью». Противная маленькая «особенность»

Подробнее см.

3 голосов
/ 21 апреля 2009

Использует ли ваше приложение какие-либо пользовательские элементы управления или элементы управления, которые вы написали сами? Можете ли вы воспроизвести эту проблему с очень простой формой?

Этот ...

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/4bc34266-edf9-430c-ad5a-c6e29392eb2d

... и это ...

http://social.expression.microsoft.com/Forums/zh-CN/netfxbcl/thread/7c4d2e73-6e73-4f10-a614-13fd76b2f419

... похоже, похожие проблемы. Однако они обычно говорят о пользовательских элементах управления, которые не могут утилизировать объект (и, как таковые, утечки дескрипторов GDI).

Возможно ли, что где-то еще в вашем приложении вы пропускаете дескрипторы?

1 голос
/ 21 апреля 2009

Возможно ли, что вы обнаружили это только на Windows Vista, потому что свободной памяти меньше, чем на Windows XP? Если машины имеют примерно одинаковую спецификацию, то я предполагаю, что в коробке Vista будет меньше свободной памяти и, следовательно, быстрее будут выделены проблемы с утечками памяти.

Другая возможность состоит в том, что вы пытаетесь визуализировать слишком много, поскольку в стеке вызовов указано, что имеется прокручиваемый элемент управления. Возможно ли, что вы визуализируете кучу вещей, которые фактически не видны?

0 голосов
/ 21 апреля 2009

Как часто вы отображаете эту форму? Это может быть проблема с дескрипторами окон (или их отсутствие).

Я работал над проектами, которые содержат диалоги с сотнями элементов управления, и были проблемы с памятью / дескриптором, так как диалоги не были удалены после использования.

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

На мой взгляд, проще и проще уничтожить то, что вам не нужно, как только вы закончите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...