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

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

Ответ 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. Вы можете найти эти два полезных:

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

Ответ 3

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

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