System componentmodel win32exception ошибка при создании дескриптора окна

Создание дескриптора окна и ошибка System.componentModel.Win32Exception C# Решение и ответ на вопрос 1467243

6 / 6 / 3

Регистрация: 01.04.2015

Сообщений: 20

1

03.06.2015, 16:42. Показов 3533. Ответов 2


Программа выдает ошибку в строке 39

Необработанное исключение типа «System.ComponentModel.Win32Exception» в System.Windows.Forms.dll

Дополнительные сведения: Ошибка при создании дескриптора окна.

могу предположить, что это из-за того, что в форме 3 используется тот же код с теми же переменными, только другими цифрами, если это так, то что делать?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication4
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }
        Button[] btn = new Button[100];
        int x0 = 3, y0 = 3, a = 25;
        int i, z, k_m = 0, pkk=0;
        int[] pkm = new int[100];
        int [] pole;
        int mins = 15; //количество мин всего
        int k_ok = 0;//количество открытых клеток
       // char turn = ' ';
        bool block;
 
        private void Form4_Load(object sender, EventArgs e) //в форме
        {
            Random rnd = new Random(); pole = new int[100];
            for (i = 0; i < 100; i++)
                    {
                            btn[i] = new Button();
                            btn[i].BackColor = Color.White;//белый фон 
                            btn[i].Height = btn[i].Width = a;
                            btn[i].Left = x0 + a * (i % 10); // % остаток
                            btn[i].Top = y0 + a * (i / 10);
                            btn[i].Parent = this;
                            btn[i].Text = "";
                        //обнуление 
                            if (i == 0)
                            {
                                for (int j = 0; j < 100; j++ )
                                {
                                    pole[j] = 0;
                                    pkm[j] = 0;
                                }
                                k_ok = 0; k_m = 0; pkk = 0;
                            }
                            if (i == 99)
                            {
                                while (k_m < mins)
                                {
                                    int x = rnd.Next(0, 100);
                                    if (pole[x] != 10) { pole[x] = 10; k_m++; };//ставлю мину 
                                }
                                for (i = 0; i < 100; i++ )
                                    if (pole[i] == 10)//если бомба, то в 8 клетках. в которых нет бомбы плюсуется колво бомб рядом
                                    {
                                        //уголки
                                        if (i == 0) { if (pole[i + 1] != 10) pole[i + 1] += 1; if (pole[i + 5] != 10) pole[i + 5] += 1; if (pole[i + 6] != 10) pole[i + 6] += 1; }
                                        if (i == 9) { if (pole[i - 1] != 10) pole[i - 1] += 1; if (pole[i + 5] != 10) pole[i + 5] += 1; if (pole[i + 4] != 10) pole[i + 4] += 1; }
                                        if (i == 90) { if (pole[i + 1] != 10) pole[i + 1] += 1; if (pole[i - 5] != 10) pole[i - 5] += 1; if (pole[i - 4] != 10) pole[i - 4] += 1; }
                                        if (i == 99) { if (pole[i - 1] != 10) pole[i - 1] += 1; if (pole[i - 5] != 10) pole[i - 5] += 1; if (pole[i - 6] != 10) pole[i - 6] += 1; }
                                        //сверху
                                        if (i > 0 && i < 4) { if (pole[i + 4] != 10) { pole[i + 4] += 1; } if (pole[i + 5] != 10) { pole[i + 5] += 1; } if (pole[i + 6] != 10) { pole[i + 6] += 1; } if (pole[i - 1] != 10) pole[i - 1] += 1; if (pole[i + 1] != 10) pole[i + 1] += 1; }
                                        //снизу
                                        if (i> 20 && i < 24) { if (pole[i - 4] != 10) { pole[i - 4] += 1; } if (pole[i - 5] != 10) { pole[i - 5] += 1; } if (pole[i - 6] != 10) { pole[i - 6] += 1; } if (pole[i - 1] != 10) pole[i - 1] += 1; if (pole[i + 1] != 10) pole[i + 1] += 1; }
                                        //слева
 
 
                                        if (i >= 5 && i % 5 == 0 && i <= 15) { if (pole[i - 4] != 10) { pole[i - 4] += 1; } if (pole[i - 5] != 10) { pole[i - 5] += 1; } if (pole[i + 5] != 10) { pole[i + 5] += 1; } if (pole[i + 6] != 10) { pole[i + 6] += 1; } if (pole[i + 1] != 10) pole[i + 1] += 1; }
 
                                        //справа
                                        if (i >= 5 && i % 5 == 4 && i <= 19) { if (pole[i + 4] != 10) { pole[i + 4] += 1; } if (pole[i - 5] != 10) { pole[i - 5] += 1; } if (pole[i + 5] != 10) { pole[i + 5] += 1; } if (pole[i - 6] != 10) { pole[i - 6] += 1; } if (pole[i - 1] != 10) pole[i - 1] += 1; }
                                        //середина
                                        if (i > 5 && i % 5 != 4 && i % 5 != 0 && i < 19) { if (pole[i + 4] != 10) { pole[i + 4] += 1; } if (pole[i - 5] != 10) { pole[i - 5] += 1; } if (pole[i + 5] != 10) { pole[i + 5] += 1; } if (pole[i - 6] != 10) { pole[i - 6] += 1; } if (pole[i - 1] != 10) { pole[i - 1] += 1; } if (pole[i + 1] != 10) { pole[i + 1] += 1; }  if (pole[i - 4] != 10) { pole[i - 4] += 1; }if (pole[i + 6] != 10) { pole[i + 6] += 1; } }
                                    }
                                i = 24;
                            }
                            btn[i].Click += Game;
                            btn[i].Font = new Font("Courier", 20);
                     } 
        }

Добавлено через 1 час 14 минут

Цитата
Сообщение от Nyusch
Посмотреть сообщение

в форме 3 используется тот же код с теми же переменными, только другими цифрами, если это так, то что делать?

это не так, я поменяла называния btn и ошибка осталась

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



  • Remove From My Forums

 none

Ошибка при создании дескриптора окна.

  • Вопрос

  • Доброго времени суток!

    Вопрос к понимающим…

    VB 2010 Express: Есть процедура, которая  производит заполнение панели (Panel) пользовательскими элементами управления (Control) — т.е. создает некий интерфейс. Процедура вызывается по запросу пользователя.  При большом
    количестве добавляемых Contol возникает Win32Exeption: «Ошибка при создании дескриптора окна».  Явно отследить, в каком месте кода возникает исключение, или невозможно («Нет доступных исходных файлов») или VB
    «привязывает» исключение к разным местам кода. У меня есть такое подозрение, что «где-то что-то переполняется», т.к. при вызове процедуры с постоянным кол-вом добавляемых Control, исключение возникает
    при определенном числе раз вызова процедуры. Тоже самое происходит в скомпилированном EXE-файле. Буду очень признателен, если кто-нибудь подскажет чем это может быть вызвано. Спасибо.

Ответы

  • Хм. А перед добавлением новых Control, вызов метода Controls.Clear для Panel (в которую добавляются Control) — это неправильно? т.е. Panel надо чистить циклом Control.Dispose?

    Метод Clear просто очищает коллекцию Controls. Сами контролы продолжают висеть в памяти до очередной сборки мусора.

    Может подскажите, а если добавляемая Panel, не будет содержать Control, а в Panel необходимые элементы рисовать через GreateGraphics — это улучшит ситуацию?

    Может улучшить, может ухудшить. Смотря как рисовать будете. Вот полезная ссылка:

    Преодолевая границы Windows: объекты USER и GDI (часть 2). Общее количество дескрипторов не должно превышать 10000, а в их число входят и кисти, и перья, так что рисуя вручную тоже можно насоздавать (и не удалить) кучу дескрипторов.

    Попробовал чистить родительскую Panel циклом — разницы не заметил. Может надо ка-то по-хитрому?

    Нужно диспозить все контролы в коллеции panel.Controls, а также рекурсивно в коллекциях самих этих контролов. В частности, если используются UserControl, то у них.

    • Предложено в качестве ответа

      19 августа 2014 г. 7:03

    • Помечено в качестве ответа
      Dmitriy VereshchakMicrosoft contingent staff, Moderator
      19 августа 2014 г. 7:03
    • Снята пометка об ответе
      Dmitriy VereshchakMicrosoft contingent staff, Moderator
      19 августа 2014 г. 7:05
    • Помечено в качестве ответа
      Dmitriy VereshchakMicrosoft contingent staff, Moderator
      20 августа 2014 г. 13:23

10 ответов

Запустили ли вы Проводник процессов или Диспетчер задач Windows, чтобы посмотреть объекты GDI Objects, Handles, Threads и USER? Если нет, выберите те столбцы, которые нужно просмотреть (диспетчер задач выбирает View- > Select Columns… Затем запустите приложение и посмотрите на эти столбцы для этого приложения и посмотрите, растет ли один из них.

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

Здесь ссылка об этом, которая может быть полезна.

Удачи!

itsmatt
21 окт. 2008, в 18:17

Поделиться

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

mjezzi
21 нояб. 2008, в 22:35

Поделиться

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

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

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

AlfredBr
08 фев. 2010, в 16:16

Поделиться

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

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

Примечание. В Delphi все элементы управления имеют свойство Owner и Parent. Даже если кто-то изменил свойство Parent элемента управления, он все равно будет распоряжаться его владельцем, когда владелец будет уничтожен.

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

kingsley
18 март 2010, в 13:19

Поделиться

Я добавил чек, который заставляет его работать…

if (_form.Handle.ToInt32() > 0)
{
   _form.Invoke(method, args);
}

это всегда верно, но форма вызывает ошибку без него.
BTW, моя ручка составляет около 4,9 млн.

xlthim
21 март 2012, в 21:23

Поделиться

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

AtliB
21 окт. 2008, в 18:05

Поделиться

user344760
01 июнь 2010, в 03:27

Поделиться

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

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

ctl.dispose()

Далее

honey0987
01 сен. 2009, в 20:32

Поделиться

Предложение из памяти не кажется неудачным.

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

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

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

rice
21 окт. 2008, в 18:16

Поделиться

Ещё вопросы

  • 0Заполнение странной веб-формы в Python
  • 0Моя программа неожиданно завершается, когда я вызываю return в рекурсивной функции
  • 0Функция фильтра jQuery regexp
  • 1Android: Помогите создать кнопку, которая дает тот же результат, что и нажатие клавиши D на D-Pad? (часть 2)
  • 1Как повысить точность измерений в iTextSharp?
  • 0Извлечение средней части URL и добавление его к новой внешней ссылке для отображения в IE8
  • 0Если результат заканчивается определенными символами, добавьте символы в конец результата.
  • 1Событие инициализации страницы framework7 не срабатывает
  • 0Использовать массивы на нескольких страницах php?
  • 1Невозможно разделить изображение с помощью Python
  • 1Случайные числа меняются при изменении ориентации
  • 0Доступ к элементу внутри templateUrl из контроллера — AngularJS
  • 1Android: получение пользовательской трансляции при нажатии кнопки в виджете
  • 0Как заменить внутренний HTML div с текстом, используя jquery?
  • 1Как я могу заглушить хапи обработчик?
  • 0MySQL временная таблица в подзапросе
  • 1Как запросить API в Android?
  • 0Символы не найдены для архитектуры armv7 при импорте файла cpp из примера проекта iOS
  • 0Расшифровать объект JSON
  • 1Как я могу получить доступ к DOM в AngularDart?
  • 0что будет, если мы подадим сигнал семафору без ожидания?
  • 1Операция со списком файлов не удалась после нескольких раундов
  • 1Создание библиотеки JAR с другими библиотеками
  • 0Скачайте эскизы изображения с помощью Dropbox API для php
  • 0Проверка JS, перейдите по ссылке, если оба входа верны
  • 1«Невозможно загрузить библиотеку: собственная поддержка JNA не найдена в пути к ресурсу» при попытке загрузить библиотеку JNA в Mac OS X
  • 0как показать дату с daterange (2 даты) в sql
  • 1как развернуть встраиваемый Java-костюм в системе OpenWRT
  • 0Как сбросить функцию генератора переменного тока ()
  • 1Интеграция Flickr и Youtube на Android
  • 0Как сделать сообщение о загрузке видимым после того, как пользователь нажимает кнопку Отправить в форме?
  • 1Моя страница JSP не перенаправляет на Myservlet, используя форму
  • 0Матричное умножение «Логическая ошибка в цикле» (C ++ ООП)
  • 1Как распаковать несколько объектов словаря внутри списка в строке данных?
  • 1Почему в аннотациях Struts 2 отсутствует LongRangeFieldValidator
  • 1Android — Где установить цвет нажатой, сфокусированной … вкладки?
  • 0Создать функции из значений массива
  • 1Алфавитная сортировка массива синхронно с другим массивом
  • 1Обновлять словарь за итерацию, а не за весь
  • 0индексация по одному столбцу против индексации по нескольким столбцам
  • 1Диалог OpenFile в Java дает ноль в качестве ответа
  • 0Обновление углового обзора из обратного вызова SignalR
  • 0AWS RDS использует IM-политику для подключения к другому пользователю.
  • 1почему члены данных инициализируются значениями по умолчанию, а локальные переменные — нет?
  • 1Проблема производительности в активных отчетах 6
  • 1Когда мы должны использовать ListCollectionView? [Дубликат]
  • 0Как показать-скрыть именованное представление в angular-ui-router
  • 1код работает намного медленнее на Java 7u55, чем предыдущие версии?
  • 0JavaScript / JQuery Parse XML
  • 0сделать доступным html-файл за пределами Ubuntu с помощью apache2


этот вопрос уже есть ответ здесь:

  • «Ошибка При Создании Дескриптора Окна»

    7 ответов

мы видим эту ошибку в приложении Winform. Может ли кто-нибудь помочь в том, почему вы видите эту ошибку, и, что более важно, как ее исправить или избежать ее.


System.ComponentModel.Win32Exception: Error creating window handle.
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
at System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e)


619  


10  

10 ответов:

вы запустили Process Explorer или Диспетчер задач Windows, чтобы посмотреть на объекты GDI, дескрипторы, потоки и пользовательские объекты? Если нет, выберите эти столбцы для просмотра (Диспетчер задач выберите вид->выбрать столбцы… Затем запустите приложение и посмотрите на эти столбцы для этого приложения и посмотрите, действительно ли один из них растет.

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

здесь ссылка об этом, что может быть полезным.

Удачи!

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

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

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

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

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

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

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

в C# кажется, что если элемент управления, например панель, программно переназначается, скажем, из формы на вкладку, изменив панель.Родительское свойство, вызывающее Dispose() в форме, не будет удалять панель, и не будет вызов элементов управления.Очистить () На вкладке страницы. Даже панель прямого вызова.Dispose () фактически не будет его утилизировать, если его родитель не установлен вручную в null заранее.

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

Я добавил чек, который заставляет его работать…

if (_form.Handle.ToInt32() > 0)
{
   _form.Invoke(method, args);
}

это всегда так, но форма выдает ошибку без нее.
Кстати, моя ручка составляет около 4,9 миллиона

Я получил ту же ошибку в моем приложении.Я загружаю много элементов управления в одном page.In нажмите кнопку событие я очищаю элементы управления.очистка элементов управления не освобождает элементы управления от memory.So утилизируйте элементы управления из памяти.
Я только что прокомментировал управление.очистите метод() и включите несколько строк кода для удаления элементов управления.
Что-то вроде этого

для каждого ЦТЛ в качестве контроля в экземпляре коллекции controlcollection

ctl.dispose ()

далее

предложение из памяти не кажется плохим руководством.

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

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

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

Понравилась статья? Поделить с друзьями:
  • Syntax error макрос
  • System componentmodel win32exception 0x80004005 x360ce как исправить
  • System componentmodel win32exception 0x80004005 unknown error 0xc1420127
  • Syntax error word unexpected expecting python
  • Syntax error while compiling перевод