Каков верхний предел для объектов GDI для одного процесса в Windows 7? - PullRequest
14 голосов
/ 15 марта 2012

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

Ответы [ 3 ]

15 голосов
/ 15 марта 2012

10K - это жесткое ограничение.

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

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

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

6 голосов
/ 15 марта 2012

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

У

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

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

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

0 голосов
/ 31 октября 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...