Каков верхний предел объектов GDI для одного процесса в Windows 7?

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


person Micky    schedule 15.03.2012    source источник
comment
У меня сработало увеличение GDIProcessHandleQuota до 20,000. Пришлось перезапустить систему после изменения реестра. Обновлен ключ реестра на HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota   -  person Abhinav Galodha    schedule 07.03.2018


Ответы (3)


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

Do

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

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

См. KB184802 для получения дополнительной информации. Выполните поиск SharedSection, чтобы найти соответствующую часть страницы.

person JimR    schedule 15.03.2012
comment
Бинго! Я увеличил кучу рабочего стола и теперь могу работать с более чем 10 000 объектов GDI. Наш ведущий разработчик уже придумал патч, но теперь мое любопытство разрешено. Спасибо - person Micky; 15.03.2012
comment
Привет! мой SharedSection установлен на 1024,20480,768, но мой python.exe по-прежнему дает сбой. Читал, что увеличивать кучу рабочего стола более 20480 небезопасно? каково ваше мнение? - person Aleksandar; 15.07.2013
comment
@Aleksandar: Если я правильно помню, сумма всех этих чисел не может превышать 48 МБ. Эти числа выделяют память в килобайтах. Есть и другие ограничения в зависимости от того, сколько и какие сервисы у вас запущены. Прочтите первые 3 ссылки в ответе Дерека Паркс, чтобы получить хорошее представление. Также убедитесь, что вы не создаете более 10 000 объектов GDI. - person JimR; 16.07.2013

10 КБ - жесткий лимит.

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

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

Еще одна хорошая статья от Раймонда Чена:

person Derek Park    schedule 15.03.2012
comment
Спасибо за информацию. Я просмотрел статьи «Расширяя границы Windows» перед тем, как опубликовать здесь, и заметил, что Марк Р. не показывает вам, как изменить реестр, чтобы расширить ограничение GDI по умолчанию за пределы 10 КБ, поэтому я подумал, что, возможно, он упустил из виду. Я все еще не понимаю, почему это число может достигать 65535, если оно не оказывает заметного влияния на мою машину. Я могу использовать более 10 тысяч объектов для всех моих процессов без задержек в Windows, только когда одно приложение достигнет 10 тысяч, когда я получаю сбой. - person Micky; 15.03.2012
comment
10K is a hard limit. это кажется неправдой. Не могли бы вы добавить подробную информацию о связи ограничения, о котором вы говорите, в инструкции в ответе JimR - person Wolf; 14.01.2015
comment
Существует ключ реестра под названием GDIProcessHandleQuota. Кажется, не так уж и сложно изменить этот предел. Я думаю, вы смешали дескрипторы GDI и дескрипторы пользователя. - person Thomas Weller; 17.11.2017
comment
Я знаю, что эта ветка старая, но для тех, кто хочет увидеть ссылки Руссиновича выше (которые мертвы, по крайней мере, для меня), вот живые: techcommunity.microsoft.com / t5 / windows-blog-archive / и techcommunity.microsoft.com/t5/windows-blog-archive/ - person jimo3; 25.07.2020

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

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

person wolf    schedule 31.10.2013