2012-03-15 6 views
13

Имейте приложение с утечкой GDI, которая в конечном итоге ударит 10 000 выделенных объектов GDI и сбой. Я попытался увеличить GDIProcessHandleQuota до 20 000, но программа по-прежнему разбилась, когда она достигла 10 000 объектов. В настоящее время мы работаем над исправлением этой утечки, но из любопытства - есть ли способ увеличить лимит GDI для одного процесса? Или 10k - жесткий лимит отдельного приложения?Каков верхний предел для объектов GDI для одного процесса в Windows 7?

+0

Увеличение 'GDIProcessHandleQuota' до' 20 000' работало для меня. Необходимо перезапустить систему после изменения реестра. Обновлен ключ реестра в разделе «HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ GDIProcessHandleQuota' – Agalo

ответ

6

Существует решение, которое может Работа , Я имею дело с приложением вспылила поставщика здесь, который выделяет тонны объектов GDI и это решение позволяет ему работать большую часть времени ...

ли

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" /v windows

Посмотрите на SharedSection=, который должен быть 3 номера разделенных запятыми. Увеличьте среднее число на 1024 за раз и посмотрите, решит ли это вашу проблему. Вы контролируете количество «кучи рабочего стола» с помощью этой переменной, которая в прошлом позволяла мне запускать GDI.

Посмотрите на KB184802, чтобы узнать больше. Найдите SharedSection, чтобы найти соответствующую часть страницы.

+0

Бинго! Я наткнулся на кучу рабочего стола, и теперь я могу выйти за пределы 10 000 объектов GDI. Наш ведущий разработчик уже придумал патч, но теперь мое любопытство разрешено. Спасибо – Micky

+0

Привет! для моего SharedSection установлено 1024,20480,768, но мой python.exe по-прежнему падает. Я читал, что небезопасно увеличивать объем рабочего стола на 20480? Каково ваше мнение? – Aleksandar

+0

@Aleksandar: Если я правильно помню, сумма из всех этих чисел не может превышать 48 МБ. Эти цифры выделяют память в килобайтах. Существуют и другие ограничения, основанные на том, сколько и каких сервисов у вас работает. Прочтите первые 3 ссылки в Derek Parks для хорошего фона. Также убедитесь, что вы не создаете более 10 000 объектов GDI. – JimR

15

10K - жесткий предел.

Объекты GDI представляют собой интерфейсные ресурсы графического интерфейса, такие как шрифты, растровые изображения, кисти, ручки и контексты устройства (поверхности рисования). Как это делает для объектов USER, пределов оконного менеджера обрабатывают не более чем 10000 объекты GDI [...]

Марк Руссинович имеет ряд статей, которые идут в углубленном о различных ограничениях в Windows. Вы можете найти эти две полезно:

Еще одна хорошая статья от Raymond Chen:

+1

Спасибо за информацию. Я просмотрел статьи «Нажатие ограничений на Windows» перед публикацией здесь и заметил, что Марк Р.не показывает вам, как изменить реестр, чтобы расширить лимит GDI по умолчанию за пределами 10k, поэтому я решил, что, возможно, это было что-то, что он забыл. Я все еще смущен, почему это число может достигать 65535, если оно не оказывает заметного влияния на мою машину. Я могу потреблять намного больше, чем 10k объектов для всех моих процессов без запаздывания в Windows, только когда одно приложение достигает 10k, когда я получаю сбой. – Micky

+0

'10K - это трудный предел. 'Кажется, это не так. Не могли бы вы предоставить дополнительные сведения о связи ограничения, на которое вы ссылаетесь, на howto в [Ответ JimR] (http://stackoverflow.com/a/9723784/2932052) – Wolf

+0

Существует ключ реестра GDIProcessHandleQuota. Кажется, не так сложно изменить этот предел. Я думаю, что вы смешивали дескрипторы GDI и пользовательские ручки. –

0

Я могу увеличить объекты GDI с 10000 до 15000, изменив ТОЛЬКО GDIProcessHandleQuota, но для этого требуется перезагрузка. Мне не нужно было менять значения SharedSection, требовалась перезагрузка.

Хотя 10000 кажется большим числом, мое приложение имеет большой пользовательский интерфейс с множеством кнопок, кистей, изображений, значков и т. Д. После запуска приложения количество объектов увеличивается только в том случае, если пользователь делает что-то, что заслуживает увеличение. Объекты GDI не протекают из приложения. Чтобы проверить мое решение, я добавил метод «утечки», поэтому я мог наблюдать в диспетчере задач, что произошло, поскольку количество объектов GDI увеличилось за пределы ограничений.

 Смежные вопросы

  • Нет связанных вопросов^_^