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

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

3 ответов


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

Do

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

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

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


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

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

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

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


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

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