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

cedric3333 Messages postés 4 Date d'inscription samedi 18 avril 2009 Statut Membre Dernière intervention 20 avril 2009 - 18 avril 2009 à 15:31
cedric3333 Messages postés 4 Date d'inscription samedi 18 avril 2009 Statut Membre Dernière intervention 20 avril 2009 - 20 avril 2009 à 09:19
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
A voir également:

6 réponses

Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
18 avril 2009 à 17:13
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
0
cedric3333 Messages postés 4 Date d'inscription samedi 18 avril 2009 Statut Membre Dernière intervention 20 avril 2009
18 avril 2009 à 18:03
Bonjour,
merci beaucoup pour ta réponse. Comment tu fais pour voir le nombre de Objets USER? je n'y arrive pas
0
Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
19 avril 2009 à 09:09
C'est une colonne à ajouter dans le taskmanager:
Menu affichage -> Sélectionner les colonnes.
La tu choisis objets USER.
0
cedric3333 Messages postés 4 Date d'inscription samedi 18 avril 2009 Statut Membre Dernière intervention 20 avril 2009
19 avril 2009 à 10:03
Merci. Alors je viens de regardé. Lorsque mon programme plante, j'ai en tout j'ai 2800 objets USER dont 148 pour mon aplli.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
19 avril 2009 à 21:12
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!
0
cedric3333 Messages postés 4 Date d'inscription samedi 18 avril 2009 Statut Membre Dernière intervention 20 avril 2009
20 avril 2009 à 09:19
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
0
Rejoignez-nous