Имейте приложение с утечкой GDI, которая в конечном итоге ударит 10 000 выделенных объектов GDI и сбой. Я попытался увеличить GDIProcessHandleQuota до 20 000, но программа по-прежнему разбилась, когда она достигла 10 000 объектов. В настоящее время мы работаем над исправлением этой утечки, но из любопытства - есть ли способ увеличить лимит GDI для одного процесса? Или 10k - индивидуальный жесткий лимит приложения?
Каков верхний предел для объектов GDI для одного процесса в Windows 7?
Ответ 1
Существует решение, которое может работать. Я имею дело с неудачным приложением для поставщиков здесь, которое выделяет множество объектов GDI, и это решение позволяет ему работать большую часть времени...
Do
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" /v windows
Найдите SharedSection=
, который должен состоять из 3 чисел, разделенных запятыми. Увеличьте среднее число на 1024 за раз и посмотрите, решит ли это вашу проблему. Вы контролируете количество "дескрипторов рабочего стола" с этой переменной, которая в прошлом позволяла мне запускать GDI с ошибкой.
Посмотрите KB184802 для получения дополнительной информации. Найдите SharedSection, чтобы найти соответствующую часть страницы.
Ответ 2
10K является жестким пределом.
Объекты GDI представляют собой ресурсы интерфейса графического интерфейса, такие как шрифты, растровые изображения, кисти, ручки и контексты устройств (поверхности рисования). Как и для объектов USER, диспетчер окон ограничивает процессы не более чем 10 000 объектов GDI [...]
У Марка Руссиновича есть серия статей, в которых подробно рассказывается о различных ограничениях в Windows. Вы можете найти эти два полезных:
- Нажатие ограничений Windows: объекты USER и GDI - часть 1
- Нажатие ограничений Windows: объекты USER и GDI - часть 2
Еще одна хорошая статья из Раймонда Чена:
Ответ 3
Я могу увеличить свои объекты GDI с 10000 до 15000, изменив ТОЛЬКО GDIProcessHandleQuota, но для этого требуется перезагрузка. Мне не пришлось менять значения SharedSection, требуется только перезагрузка.
В то время как 10000 кажется большим числом, мое приложение имеет большой пользовательский интерфейс с множеством кнопок, кистей, изображений, значков и т.д. После запуска приложения количество объектов увеличивается только в том случае, если пользователь делает что-то, что заслуживает увеличение. Объекты GDI не протекают из приложения. Чтобы проверить мое решение, я добавил метод "утечки", поэтому я мог наблюдать в диспетчере задач, что произошло, поскольку количество объектов GDI увеличилось за пределы ограничений.