Проблема Winforms - Ошибочный дескриптор окна создания [дубликат]

60
задан Yi Jiang 30 January 2011 в 04:02
поделиться

9 ответов

Вы запустили Проводник Процесса или Windows Task Manager для рассмотрения Объектов GDI, Дескрипторов, Потоков и Пользовательских объектов? В противном случае выберите те столбцы, которые будут просматриваться (Диспетчер задач выбирают View-> Select Columns... Тогда запустите свое приложение и смотрите на те столбцы для того приложения и посмотрите, становится ли один из тех действительно большим.

могло бы случиться так, что у Вас есть компоненты UI, что Вы думаете , очищены, но не были Расположены.

Вот ссылка об этом, которое могло бы быть полезно.

Удачи!

51
ответ дан itsmatt 24 November 2019 в 17:49
поделиться

Предел дескриптора окон для Вашего приложения является 10 000 дескрипторов. Вы получаете ошибку, потому что Ваша программа создает слишком много дескрипторов. Необходимо будет найти утечку памяти. Как другие пользователи предположили, используйте Профилировщика Памяти. Я использую.Net Профилировщика Памяти также. Кроме того, удостоверьтесь, что Вы называете расположить метод на средствах управления при удалении их из формы прежде завершения формы (иначе, средства управления не расположат). Необходимо будет также удостовериться, что нет никаких событий, зарегистрированных в управлении. У меня самого есть та же проблема, и несмотря на то, что я уже знаю, у меня все еще есть некоторые утечки памяти, которые продолжают ускользать от меня..

25
ответ дан mjezzi 24 November 2019 в 17:49
поделиться

Из предложения памяти не походит на плохой вывод.

, Что Ваша программа делает это, это получает эту ошибку?

это создает очень много окон или средств управления? Это создает их программно в противоположность во время проектирования? Если так, Вы делаете это в цикле? Тот цикл бесконечен? Вы используете колеблющиеся полные лодки памяти некоторым другим способом?

, Что происходит, когда Вы наблюдаете память, используемую Вашим приложением в диспетчере задач? Это взлетает на луну? Или еще лучше, как предложено выше использования обрабатывают монитор для дайвинга в детали.

-2
ответ дан rice 24 November 2019 в 17:49
поделиться

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

1
ответ дан AtliB 24 November 2019 в 17:49
поделиться

См. этот мой пост об «Ошибка создания дескриптора окна» и о том, как это связано с объектами USER и кучей рабочего стола. Я предлагаю несколько решений.

11
ответ дан 24 November 2019 в 17:49
поделиться

У меня такая же ошибка в приложении. Я загружаю много элементов управления на одной странице. При нажатии кнопки я очищаю элементы управления. очистка элементов управления не освобождает элементы управления из памяти, поэтому удалите элементы управления из памяти. Я просто прокомментировал метод controls.clear () и добавил несколько строк кода для удаления элементов управления. Примерно так

для каждого ctl как элемента управления в controlcollection

ctl.dispose ()

Next

1
ответ дан 24 November 2019 в 17:49
поделиться

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

Когда я отслеживаю одну из таких ошибок, я открываю ProcessExplorer и смотрю на эти колонки: Handles, Threads, GDI Objects, USER Objects, Private Bytes, Virtual Size и Working Set.

(По моему опыту, проблема обычно заключается в утечке объекта из-за того, что обработчик событий удерживает объект и не дает ему быть утилизированным)

.
6
ответ дан 24 November 2019 в 17:49
поделиться

Ну, в моем случае это определенно были объекты USER, которые вышли из-под контроля. Я заглянул в диспетчер задач Windows и, конечно же, количество объектов USER было точно на уровне 10 000.

Я динамически внедряю листы свойств и списков в страницы табуляции, устанавливая свойство Parent панели контейнера свойства или листа списка на свойство страницы табуляции. Я условно перерабатываю или повторно создаю формы свойств и листа списка в зависимости от типа коллекции, в которую входит список, или типа класса проверяемого объекта.

NB: В Дельфах,все элементы управления имели собственность Владельца и Родителя. Даже если изменить родительское свойство контроля, оно все равно будет отчуждено его владельцем, когда владелец будет уничтожен.

В C# кажется, что если элемент управления, например Panel, программно переназначен, скажем, с Form на страницу tab путем изменения свойства Panel.Parent, вызов Dispose() в form не будет удалять Panel, равно как и вызов Controls.Clear() на странице tab. Даже прямой вызов Panel.Dispose() фактически не будет удалять его, если его родитель не будет вручную установлен в null заранее.

2
ответ дан 24 November 2019 в 17:49
поделиться

Определенно слишком много обработчиков (проблема утечки памяти):

IT Jungles: System.ComponentModel.Win32Exception: Error creating window handle

0
ответ дан 24 November 2019 в 17:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: