Member 11989746 Ответов: 1

Добавление пользовательского элемента управления winform 1000 раз в форму вызывает исключение {"error creating window handle."}, как его устранить?


1. Winform пользовательский элемент управления имеет две панели, Б. закрепленной налево, Б размещена для заполнения.
2. панель а имеет две кнопки (без событий), панель Б имеет две метки и два текстовых поля (без событий).
3. Добавление пользовательского элемента управления в форму с использованием заданных строк, эта форма не имеет никакого другого элемента управления.

public partial class Form1 : Form
    {
        private UserControl1 userControl;
        public Form1()
        {
            InitializeComponent();

            for (int i = 0; i <1000; i++)
            {
                userControl = new UserControl1();
                userControl.Dock = DockStyle.Top;
                Controls.Add(userControl);
            }
        }
    }

4. приведенная ниже ошибка возникает в строке
Application.Run(new Form1());
, любое решение для добавления большого количества пользовательских элементов управления в форму?

System.ComponentModel.Win32Exception
  HResult=0x80004005
  Message=Error creating window handle.
  Source=System.Windows.Forms
  StackTrace:
   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(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


Что я уже пробовал:

ищете решение для решения этой проблемы?

MadMyche

Зачем вам нужно так много элементов управления?

Member 11989746

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

Richard MacCutchan

У вас закончились системные ресурсы. Нет никакой веской причины добавлять в форму такое количество элементов управления; вам нужно переосмыслить свой дизайн.

Member 11989746

Память процесса остается на уровне 37 МБ, CUP использует менее 10<.
Я не эксперт, но я запустил GB размер игр на этом ПК, почему это маленькое приложение плачет?

Richard MacCutchan

Скорее всего, у вас закончились дескрипторы Windows. Хватит тратить на это время.

Dave Kreskowiak

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

Вы действительно не можете, ни в коем случае, добавить более тысячи элементов управления в форму.

Пул дескрипторов использует не только ваше приложение. Это каждое приложение, окно, файл, объект GDI, устройство,..., ...,... Все системы в Windows.

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

Ваш пользовательский элемент управления использует минимум 10 ручек, за каждый экземпляр, который вы создаете. Поздравления. Вы только что попытались выделить более 10 000 дескрипторов в своем приложении и удивляетесь, почему оно просто взорвалось?

Если вы исчерпаете пул дескрипторов, Windows станет очень нестабильной и даже рухнет на вас.

Gerry Schmitz

Задавайте глупые вопросы, ожидайте глупых ответов.

Глупая трата времени каждого.

0x01AA

Хорошее наблюдение! И нет, я не считаю этот вопрос глупым. Знать пределы системы (или, по крайней мере, чувствовать ее) - очень хорошая идея.

И для всех, кто считает этот вопрос глупым: каков предел контроля, который можно добавить без проблем? Аааа, это зависит от ситуации к ситуации... и какие приложения работают... :-)

1 Ответов

Рейтинг:
1

ZurdoDev

На самом деле, ошибка не совсем происходит в строке "приложение.Run(new Form1());". Если бы вы подошли к этой линии, вы бы увидели, что она попадает в вашу петлю. Ошибка, скорее всего, означает, что у вас закончились дескрипторы. Однако вы можете погуглить ошибку для других вариантов.

Я бы записал вашу переменную цикла (i) в окно отладки, чтобы вы могли точно видеть, когда это происходит. Если это происходит после 10 итераций, то, скорее всего, происходит что-то еще. Но если он близок к 1000, то наверняка у вас заканчиваются ручки.


0x01AA

5 баллов за ответ.

"Из ручек, близких к 1000": я думаю, что важно, какие именно ручки. Skype и многие браузеры обычно показывают более 1000 дескрипторов в диспетчере задач. Я думаю, что проблема заключается в объектах GDI...

ZurdoDev

Я просто присмотрелся к коду поближе, и OP создает бесконечный цикл.

0x01AA

Я не вижу бесконечного цикла ...?

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

Member 11989746

общественный разделяемого класса файл usercontrol1 : элемент управления UserControl
{
общественные файл usercontrol1()
{
метод InitializeComponent();
}
}

Это все, UserControl1 ничего не делает, как описано в вопросе, этот пользовательский элемент управления имеет панели, кнопки, метки и текстовые поля (детали, упомянутые в вопросе) и вообще никакого другого шага.

Member 11989746

Бесконечной петли не существует.

ZurdoDev

Вы правы, я все неправильно понял. Однако ответ все тот же.

ZurdoDev

- Да, ты прав. Я просто перечитал его еще раз. Каким-то образом я увидел класс, в котором был код, как UserControl1 вместо Form1.

0x01AA

Ваш [Править]:
Цикл 1...1000 в Form1 и не в самом деле UserControl1 или я что-то упускаю