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

We are seeing this error in a Winform application. Can anyone help on why you would see this error, and more importantly how to fix it or avoid it from happening.

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)

Yi Jiang's user avatar

Yi Jiang

49.3k16 gold badges136 silver badges135 bronze badges

asked Oct 21, 2008 at 17:01

leora's user avatar

0

Have you run Process Explorer or the Windows Task Manager to look at the GDI Objects, Handles, Threads and USER objects? If not, select those columns to be viewed (Task Manager choose View->Select Columns… Then run your app and take a look at those columns for that app and see if one of those is growing really large.

It might be that you’ve got UI components that you think are cleaned up but haven’t been Disposed.

Here’s a link about this that might be helpful.

Good Luck!

answered Oct 21, 2008 at 18:06

itsmatt's user avatar

itsmattitsmatt

31.2k10 gold badges100 silver badges164 bronze badges

1

The windows handle limit for your application is 10,000 handles. You’re getting the error because your program is creating too many handles. You’ll need to find the memory leak. As other users have suggested, use a Memory Profiler. I use the .Net Memory Profiler as well. Also, make sure you’re calling the dispose method on controls if you’re removing them from a form before the form closes (otherwise the controls won’t dispose). You’ll also have to make sure that there are no events registered with the control. I myself have the same issue, and despite what I already know, I still have some memory leaks that continue to elude me..

answered Nov 21, 2008 at 21:38

mjezzi's user avatar

mjezzimjezzi

5201 gold badge4 silver badges11 bronze badges

This problem is almost always related to the GDI Object count, User Object count or Handle count and usually not because of an out-of-memory condition on your machine.

When I am tracking one of these bugs, I open ProcessExplorer and watch these columns: Handles, Threads, GDI Objects, USER Objects, Private Bytes, Virtual Size and Working Set.

(In my experience, the problem is usually an object leak due to an event handler holding the object and preventing it from being disposed.)

answered Feb 8, 2010 at 14:36

AlfredBr's user avatar

AlfredBrAlfredBr

1,28113 silver badges25 bronze badges

3

I think it’s normally related to the computer running out of memory so it’s not able to create any more window handles. Normally windows starts to show some strange behavior at this point as well.

answered Oct 21, 2008 at 17:13

AtliB's user avatar

AtliBAtliB

1,2631 gold badge18 silver badges30 bronze badges

0

I got same error in my application.I am loading many controls in single page.In button click event i am clearing the controls.clearing the controls doesnot release the controls from memory.So dispose the controls from memory.
I just commented controls.clear() method and include few lines of code to dispose the controls.
Something like this

for each ctl as control in controlcollection

ctl.dispose()

Next

answered Sep 1, 2009 at 19:10

Well, in my case it was definitely the USER Objects that were out of control. I looked in the Windows Task Manager and sure enough, the USER Objects count was at 10’000 exactly.

I am dynamically embedding property and list sheets in Tab Pages by setting the Parent property of the property or list sheet’s container panel to that of the Tab Page. I am conditionally recycling or re-creating the property and list sheet forms depending on the type of collection being listed or class type of the object being inspected.

NB: In Delphi, all controls had an Owner and a Parent property. Even if one changed the Parent property of a control, it would still be disposed by its owner when the owning control got destroyed.

In C# it seems that if a control e.g. a Panel is programmatically reassigned from, say, a Form to a Tab Page by changing the Panel.Parent property, calling Dispose() on the Form won’t dispose the Panel, neither will calling Controls.Clear() on the Tab Page. Even a direct call Panel.Dispose() won’t actually dispose it, unless its Parent is manually set to null beforehand.

answered Mar 18, 2010 at 12:38

kingsley's user avatar

I added a check that makes it work…

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

it is always true, but the form throws an error without it.
BTW, my handle is around 4.9 million

answered Mar 21, 2012 at 19:32

xlthim's user avatar

1

sealz's user avatar

sealz

5,3485 gold badges40 silver badges70 bronze badges

answered Jun 1, 2010 at 2:25

user344760's user avatar

user344760user344760

691 silver badge3 bronze badges

The out of memory suggestion doesn’t seem like a bad lead.

What is your program doing that it gets this error?

Is it creating a great many windows or controls?
Does it create them programatically as opposed to at design time?
If so, do you do this in a loop? Is that loop infinite?
Are you consuming staggering boatloads of memory in some other way?

What happens when you watch the memory used by your application in task manager? Does it skyrocket to the moon? Or better yet, as suggested above use process monitor to dive into the details.

answered Oct 21, 2008 at 18:11

rice's user avatar

ricerice

1,0636 silver badges17 bronze badges

  • Remove From My Forums

 locked

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

  • Вопрос

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

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

    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

Студворк — интернет-сервис помощи студентам

Программа выдает ошибку в строке 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 и ошибка осталась

  • 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

6 / 6 / 3

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

Сообщений: 20

1

03.06.2015, 16:42. Показов 3476. Ответов 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

Что ж, в моем случае это определенно были объекты ПОЛЬЗОВАТЕЛЯ, которые вышли из-под контроля. Я заглянул в Диспетчер задач Windows и, конечно же, количество объектов ПОЛЬЗОВАТЕЛЯ было ровно 10 000.

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

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

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

Есть winform форма, из базы данных подгружается список определенных данных, на базе которых формируется что-то типа репитера на базе ControlCollection. Элемент репитера — кастомный контрол, на котором есть около 5-6 стандартных контролов (групировка, лейблы, текстбоксы, кнопки). Каждый элемент списка — соответствует такому кастомному контролу. При попытке вставить более чем определенное количество элементов (в моем случае около 900) возникает «Ошибка при создании дескриптора окна». При том, что форма при инициализации на какое то время зависает.

Exception Information
*********************************************
Exception Type: System.ComponentModel.Win32Exception
NativeErrorCode: 8
ErrorCode: -2147467259
Message: Ошибка при создании дескриптора окна.
Data: System.Collections.ListDictionaryInternal
TargetSite: Void CreateHandle(System.Windows.Forms.CreateParams)
HelpLink: NULL
Source: System.Windows.Forms

StackTrace Information
*********************************************
в System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
в System.Windows.Forms.Control.CreateHandle()
в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl()
в System.Windows.Forms.Control.ControlCollection.Add(Control value)
в MD.ControlArray.AddNewButton(Int32 topPos, Int32 leftPos, Details lICFCode) в F:ProjectsMDMDClassesControlArray.cs:строка 50
в MD.FormVorschau.AddNewICFControl(Details lICFCode) в F:ProjectsMDMDFormVorschau.cs:строка 828
в MD.FormVorschau.FillListOfCodeControls() в F:ProjectsMDMDFormVorschau.cs:строка 851

####################################################################################################################

Сразу обмолвлюсь, что форму создавал другой человек, которого уже не найти . Ессно клиент переделывать во что-то более внятное не хочет, потому у меня есть несколько вопросов:

1. Ошибка возникает потому что не хватает памяти, или дескрипторов окна?
2. Что можно сделать для убыстрения формы, или хотя бы устранения подобной ошибки?
3. Где можно внятно почитать об особенностях ControlCollection?

«Ошибка при создании дескриптора окна» — была такая проблема при использовании SourceGrid (в ней под каждую ячейку создавалось окно) — устранил путём уменьшения показываемых строк. Видимо и здесь их количество (репитеров) нужно уменьшить. Может фильтры какие-нибудь на выборку записей из БД задать.

Здравствуйте, andrewr, Вы писали:

A>Exception Information

A>*********************************************
A>Exception Type: System.ComponentModel.Win32Exception
A>NativeErrorCode: 8
Так. Если я правильно понимаю, то «NativeErrorCode: 8» — это ERROR_NOT_ENOUGH_MEMORY.

A>Сразу обмолвлюсь, что форму создавал другой человек, которого уже не найти. Ессно клиент переделывать во что-то более внятное не хочет, потому у меня есть несколько вопросов:

A>1. Ошибка возникает потому что не хватает памяти, или дескрипторов окна?
Скорее всего слишком много дескрипторов. Правда я с этим не сталкивался.

A>2. Что можно сделать для убыстрения формы, или хотя бы устранения подобной ошибки?

Виртуализовать. Пользователь же не все 900 контролов видит одновременно. Еще вариант, попробовать реализовать некоторые контролы без хэндла — просто как графический элемент (если такое возможно, конечно).

A>3. Где можно внятно почитать об особенностях ControlCollection?

Да нет там особенностей. Обычная строго-типизированная коллекция, выполняющая всякие служебные функции, типа прописывания Parent-а.

Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, andrewr, Вы писали:


A>>Exception Information

A>>*********************************************
A>>Exception Type: System.ComponentModel.Win32Exception
A>>NativeErrorCode: 8
MM>Так. Если я правильно понимаю, то «NativeErrorCode: 8» — это ERROR_NOT_ENOUGH_MEMORY.

Ага. Наконец то я уверен в этой ошибке

A>>Сразу обмолвлюсь, что форму создавал другой человек, которого уже не найти. Ессно клиент переделывать во что-то более внятное не хочет, потому у меня есть несколько вопросов:

A>>1. Ошибка возникает потому что не хватает памяти, или дескрипторов окна?
MM>Скорее всего слишком много дескрипторов. Правда я с этим не сталкивался.

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

A>>2. Что можно сделать для убыстрения формы, или хотя бы устранения подобной ошибки?

MM>Виртуализовать. Пользователь же не все 900 контролов видит одновременно. Еще вариант, попробовать реализовать некоторые контролы без хэндла — просто как графический элемент (если такое возможно, конечно).

В том то и дело, что для виртуализации нужно делать оч много переделок самой формы. Она изначально была сделана без учета подобных проблем, да и раньше надо было загружать не более 10-12 элементов. Как я сказал выше, буду продавливать замену всех лишних контролов на их отрисовку. Там даже чекбокс можно на отрисованный поменять без особой внешней разницы.

В целом все ясно. Тему можно закрывать. Спасибо откликнувшимся.

Мы наблюдаем эту ошибку в приложении 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) 

leora, 21 октября 2008 г., 21:01

67

109 867

10

Ответы:

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


AtliB, 21 октября 2008 г., 21:13

Решено

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

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

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

Удачи!


itsmatt, 21 октября 2008 г., 22:06

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

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

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

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


rice, 21 октября 2008 г., 22:11

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


mjezzi, 22 ноября 2008 г., 00:38

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


Fabrice, 8 августа 2009 г., 04:35

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

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

Ctl.dispose ()

Следующий


honey0987, 1 сентября 2009 г., 23:10

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

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

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


AlfredBr, 8 февраля 2010 г., 17:36

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

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

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

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


kingsley, 18 марта 2010 г., 15:38

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

IT-джунгли: System.ComponentModel.Win32Exception: ошибка при создании дескриптора окна


user344760, 1 июня 2010 г., 06:25

Я добавил проверку, которая заставляет работать …

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

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


xlthim, 21 марта 2012 г., 23:32

Интересные вопросы для изучения

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

Поделиться

Ещё вопросы

  • 1Как скомпилировать файлы javacc каждый раз перед запуском проекта в eclipse
  • 0Переменная, выделенная из стека C ++, не уничтожена (/ уничтожена?)
  • 0Отправка даты и времени из Android в MySQL
  • 1Объединение массивов Numpy 2d при гарантированном ненулевом равенстве
  • 1NSL KDD Особенности от Raw Live Packets?
  • 0SQLi Выбрать переменные
  • 1Регулярное выражение для отклонения всех неанглийских символов, кроме некоторых символов с ударением
  • 1Как использовать атрибут «android: inputMethod»?
  • 0Свежие данные MySQL через запрос с использованием Python
  • 1ActivationPolicy = «Заменить» не работает в Windows Phone 8.1
  • 1Spring RestTemplate пересылает большой файл в другой сервис
  • 0Еще один пример соединения с запросом mysql
  • 0Как мне очистить эти вложенные циклы?
  • 1Совпадения с регулярными выражениями
  • 1Динамический запрос crm rest builder для отношения многих ко многим
  • 0Экспоненциальный генератор чисел иногда дает «странные» результаты
  • 1Проблема с PIP в Ubuntu 18.04 (pkg_resources.DistributionNotFound: дистрибутив ‘pip == 10.0.1’ не найден и требуется приложением)
  • 1Сборка мусора (Местные ссылки)
  • 1Автоматическая установка плагинов в Android Studio
  • 0Magnific Popup — всплывающее окно во всплывающем окне. Как заставить «close» перейти в предыдущее всплывающее окно?
  • 0MySQL, используя сумму для столбца, чтобы получить общую сумму для каждой группы
  • 1Модуль веб-модуля RefrenceError не определен
  • 0Изменить функцию, чтобы использовать класс HTML вместо идентификатора
  • 0Наложение jQuery .fadeIn () (после просмотра другой вкладки браузера)
  • 1Составление счета в Python 3
  • 0Hibernate: Можно ли использовать Like и In вместе в Named Query?
  • 0C ++ store количество раз, когда main называется [closed]
  • 0Как реализовать базовую аутентификацию при загрузке Spring?
  • 0MySQL выбрать последние два вставленных идентификатора
  • 0использование перенаправления htaccess приводит к некоторому странному поведению
  • 1Я не могу просто сослаться на ребенка под идентификатором пользователя из базы данных Firebase
  • 1Потери Keras постоянно низкие, но точность начинается с высокой, а затем падает
  • 0Javascript: Как мне выполнить действие одним нажатием кнопки?
  • 1Как использовать анимацию поворота при перетаскивании вида, чтобы центральное положение постоянно менялось? Решить вопрос от степени к степени
  • 0Как выбрать, где внешний ключ не существует в других столбцах, и сравнить даты из таблиц, которые не связаны напрямую
  • 1c # serialization xml (ошибка при инициализации значений для объекта класса)
  • 1Как сделать «вставку» в ненулевую позицию в пустом списке?
  • 1Java-массивы и случайные числа
  • 0Совместимость Javascript, HTML и CSS внутри IFrame или вложенных IFrame
  • 0Значение php_value auto_prepend_file кэшировано
  • 1Как получить значения translate3d?
  • 0несколько флажков с php в таблице
  • 1Выполнение вызовов службы с использованием ServiceStack и клиента C # с проверкой подлинности Windows вызывает несанкционированное исключение
  • 1Атрибуты limitintlayout в aar не распознаются при сборке
  • 1Разделить ArrayList на несколько ArrayList в зависимости от ввода пользователя
  • 0Laravel PHP: создание объекта по умолчанию из пустого значения ошибки
  • 1Как проверить, что одно из многих условий выполнено на Мокито? Можно ли проверить, был ли вызван один ИЛИ другой метод?
  • 0Разное поведение-VisualStudio Отладчик против запуска exe
  • 0? вместо значения с обновлением Zend
  • 1KnockoutJS — настройка меню выбора на основе выбора в другом меню

Понравилась статья? Поделить с друзьями:
  • System aggregateexception произошла одна или несколько ошибок
  • System abs defaillant пежо 307 ошибка
  • Sysprep при запросе операций в режиме ожидания возникла ошибка
  • Syntaxerror invalid syntax ошибка в питоне
  • Sysprep windows 10 ошибка на этапе установки