Erreur lors de la création d un handle de fenêtre

Signaler
Messages postés
4
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
20 avril 2009
-
Messages postés
4
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
20 avril 2009
-
Bonjour a tous,
voila j'ai un problème depuis plusieurs mois que j'avais laissé de coté en me disant que je trouverai la solution plus tard. Mais bon voila je n'arrive toujours pas a le résoudre, et c'est tres important poru moi de trouver la solution. En fait j'ai un Panel1 constitué de 2 UserControl :
Le 1er : UserControl constitué d'un label et d'un textBox
Le 2eme : UserControl constitué d'un Label, une combobox et un bouton (avec une image).
Quand je clique sur le Bouton dans le UserControl2 je crée un Panel1 (donc constitué des 2 UserControl) et ainsi de suite. Ceci me permet d'afficher des hiérarchies. Si je fais 13 fois l'opération je prends le message d'erreur "Erreur lors de la création d un handle de fenêtre".

Voici comment reproduire le problème simplement. Avec cet exemple ca plante au niveau 45.
1) créer une applicaiton WinForms, avec un Form1. Mettre :
privatevoid Form1_Load(object sender, EventArgs e)
{
            this.autoscroll = true
            MonControl MonControl1 = new MonControl(1);
            this.Controls.Add(MonControl1);
}
Puis créer la classe suivante :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    class MonControl :Panel
    {
        public TextBox MaTextBox = new TextBox();
        private Button MonBouton = new Button();
        public MonControl(int nIdent)
        {
            this.MaTextBox.Dock = System.Windows.Forms.DockStyle.Top;
            this.MaTextBox.Location = new System.Drawing.Point(0, 0);
            this.MaTextBox.Size = new System.Drawing.Size(601, 20);
            this.MaTextBox.TabIndex = 0;
 
            this.MonBouton.Dock = System.Windows.Forms.DockStyle.Right;
            this.MonBouton.Location = new System.Drawing.Point(526, 20);
            this.MonBouton.Size = new System.Drawing.Size(75, 26);
            this.MonBouton.MaximumSize = new System.Drawing.Size(75, 26);
            this.MonBouton.TabIndex = 1;
            this.MonBouton.Text = "MonBouton";
            this.MonBouton.UseVisualStyleBackColor = true;
            this.MonBouton.Click += new EventHandler(MonBouton_Click);
 
            this.Controls.Add(this.MonBouton);
            this.Controls.Add(this.MaTextBox);
            this.Dock = System.Windows.Forms.DockStyle.Top;
            this.Location = new System.Drawing.Point(0, 0);
            this.Name = nIdent.ToString();
            this.Size = new System.Drawing.Size(601, 46);
        }
 
        void MonBouton_Click(object sender, EventArgs e)
        {
            this.PushButon();
        }
        publicvoid PushButon()
        {
            int nsave = this.Height;
            MonControl MonControl1 = new MonControl(Convert.ToInt32(this.Name) + 1);
            MonControl1.Dock = System.Windows.Forms.DockStyle.Bottom;
            MonControl1.MaximumSize = new Size(this.Width - 10, 20000000);
            this.Controls.Add(MonControl1);
            this.Height += MonControl1.Height;
            if(this.Parent.GetType() == typeof(MonControl))
                (this.Parentas MonControl).AjusterHauteur(nsave);
            MonControl1.MaTextBox.Text = MonControl1.Name;
            MonControl1.MaTextBox.Focus();
            MonControl1.PushButon();
        }
        publicvoid AjusterHauteur(int nsave)
        {
            int nsave2 = this.Height;
            this.Height += this.Controls[this.Controls.Count - 1].Height - nsave;
            if(this.Parent.GetType() == typeof(MonControl))
                (this.Parentas MonControl).AjusterHauteur(nsave2);
        }
    }
}
 A lexecution, cliquer sur le bouton et le reste se fait tout seul jusqu'au plantage.
Quelqu'un pourait m'aider?
Merci bp
Cédric

6 réponses

Messages postés
721
Date d'inscription
dimanche 10 juin 2001
Statut
Membre
Dernière intervention
27 mars 2011
6
Bonjour,

Chaque user control crée des "objets USER" qui correspondent à peut prêt au nombre de controles enfants se trouvant dans le user control.

La création d'un nouveau user control avec en son sein X sous controles, crééra dans le système X nouveaux objets USER.

Vous semblez faire cette opération un certain nombre de fois.

Or de mémoire il me semble que le système peut au mieux contenir 10000 objets USER simultanément (par utilisateur et par session).

Ce nombre peut etre vu dans le taskmanager (ne pas oublier d'afficher la colonne intitulée "Objets USER").

La solution consisterait à diminuer le nombre d'objets créés, en revoyant par exemple l'architecture de l'application.

En espérant vous avoir aidé, je vous souhaite une bonne fin de journée
Messages postés
4
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
20 avril 2009

Bonjour,
merci beaucoup pour ta réponse. Comment tu fais pour voir le nombre de Objets USER? je n'y arrive pas
Messages postés
721
Date d'inscription
dimanche 10 juin 2001
Statut
Membre
Dernière intervention
27 mars 2011
6
C'est une colonne à ajouter dans le taskmanager:
Menu affichage -> Sélectionner les colonnes.
La tu choisis objets USER.
Messages postés
4
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
20 avril 2009

Merci. Alors je viens de regardé. Lorsque mon programme plante, j'ai en tout j'ai 2800 objets USER dont 148 pour mon aplli.
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Bonsoir


 


C'est étrange, cela ne devarit pas planter aussi vite.


J'ai essayé ton code et effectivement ça plante à 46 iterrations.


Mais je me demande si le probleme vient du nombre de controles ou de la profondeur des user-controles.


 


J'ai fais le test suivant:
Modification du constructeur pour passer la forme Parent
Au lieu d'ajouter le nouvel MonCcontrol dans la liste des controles de son Parent, je l'ajoute à celle de la Form mère, et là je n'ai plus de plantage, mais par contre j'ai un probleme de performance au dessus de 128 iterrations.


J'ai limitter le nombre d'iterrations à 255, et j'ai effectivement ces 255 MonControl d'affichés.



class

MonControl
: Panel
{
   public  TextBox MaTextBox = newTextBox();
   private  Button MonBouton = newButton();
   Form  _ParentForm = null;
   private  staticint counter = 0;
   public  MonControl(int nIdent, Form parent)
   {
      counter++;
      _ParentForm = parent;
   ...
   }




   public


void
PushButon()
   {
   ...


   _ParentForm.Controls.Add(MonControl1);
   ...
   if (counter < 255)
      MonControl1.MonBouton.PerformClick();
   }
...
}

g, enjoy it!
Messages postés
4
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
20 avril 2009

Bonjour,
merci beaucoup pur ta réponse. C'est effectivement tout mon probleme : la profondeur m'est tres utile et est tres importante. Ce qui me gene c'est que dans mon exemple ca plante au niveau 46 mais dons mon programme (qui est plus complexe) ca plante au niveau 12, et ca c'est tres pénalisant. Tu pense que c'est une limitation du système?
Cédric