Преодоление ограничения дескриптора объекта пользователя Windows - PullRequest
4 голосов
/ 03 октября 2008

Я ищу продвинутые стратегии для работы с ограничениями User Object Handle при создании тяжелых оконных интерфейсов. Пожалуйста, объясните, как вы преодолели или обошли эту проблему, используя SWT или прямые интерфейсы Windows API. Единственное, что меня не интересует, - это стратегии по оптимизации использования виджетов, так как я сделал это всесторонне, и это не решает проблему, а только делает ее менее вероятной.

Моя ситуация:
У меня есть графический интерфейс пользователя на основе SWT, который допускает несколько сессий в одной родительской оболочке, и в каждой сессии они представляют собой 3 отдельных места, где отображается список сгенерированных пользователями комментариев. Когда пользователь открывает несколько сеансов и извлекает данные, которые заполняют эти списки, количество дескрипторов пользовательских объектов может значительно увеличиться в зависимости от количества комментариев.

Мои текущие решения:
1. Я по умолчанию выполняю постраничное комментирование, тем самым ограничивая количество строк комментариев в каждом сеансе, но из-за требований руководства у меня также есть кнопка «Просмотреть все», которая полностью обходит это.
2. Я специально рисую всю нередактируемую информацию в каждой строке. Это означает, что в каждой строке используются только 2 дескриптора объекта.
3. Я создал вызовы JNI, которые запрашивают у ОС текущее использование и максимальное использование. С этим я могу дать пользователям показания, что сбой неизбежен. Излишне говорить, что они игнорируют это предупреждение.

Ответы [ 3 ]

6 голосов
/ 03 октября 2008

Прежде всего, вы уверены, что проблема не в куче рабочего стола, а в подсчете количества дескрипторов? Каждый дескриптор может занимать определенное количество кучи рабочего стола Windows. Одна ручка USER может съесть много места, а совсем немного. Я предлагаю это, чтобы убедиться, что вы не гоняетесь за подсчетом пользовательских дескрипторов, когда это действительно что-то другое. (Google для инструмента dheapmon от Microsoft, это может помочь)

Я читал, что вы можете изменять максимальные значения дескрипторов, изменяя ключи в реестре:

HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows NT \ Текущая версия \ Windows \ USERProcessHandleQuota и GDIProcessHandleQuota

Это может быть краткосрочным исправлением для пользователей.

Я бы подошел к этому, сначала выяснив, какие 2 пользовательских маркера нужно поддерживать для каждого элемента (например, 2 для каждого элемента в списке?). Это кажется подозрительным. Дескрипторы пользователя предназначены только для нескольких объектов пользовательского интерфейса Windows верхнего уровня (Windows, меню, курсоры, положения окон, значки и т. Д.). Я не понимаю, почему ваш виджет должен хранить по 2 объекта для каждого элемента (это дескриптор значка?).

Если вы хотите разорвать все это на части - это похоже на работу для виртуального режима просмотра списка (LVS_OWNERDATA).

5 голосов
/ 03 октября 2008

Вам следует подумать об использовании элементов управления без окон. Они предназначены именно для этой ситуации. См. «Управление без окон не волшебство» , Раймонд Чен

2 голосов
/ 02 декабря 2011

Не только окна верхнего уровня, но и большинство собственных элементов управления используют один пользовательский объект каждый. См. Дайте мне ручку, и я покажу вам объект для подробного объяснения пользовательских и других типов ручек. Это также означает, что SWT использует как минимум один дескриптор пользователя для каждого виджета, даже для Composite.

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

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