Каков верхний предел для объектов 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-Часть 1
- расширение границ Windows: объекты USER и GDI-Часть 2
Еще одна хорошая статья от Раймонда Чена:
Я могу увеличить мои объекты GDI с 10000 до 15000, изменив только GDIProcessHandleQuota, но это требует перезагрузки, чтобы вступить в силу. Мне не нужно было менять значения SharedSection, требовалась только перезагрузка.
В то время как 10000 кажется большим числом, мое приложение имеет большой пользовательский интерфейс с большим количеством кнопок, кистей, изображений, иконок и т. д. Как только приложение запускается, количество объектов увеличивается только в том случае, если пользователь делает что-то, что заслуживает увеличения. Нет объектов GDI протекают из приложения. Чтобы проверить свое решение, я добавил метод "утечки", чтобы я мог наблюдать в диспетчере задач, что происходит, когда количество объектов GDI увеличивается за различными пределами.
Comments