2008-10-21 4 views
51

Cette erreur se produit dans une application Winform. Quelqu'un peut-il aider sur pourquoi vous verrait cette erreur, et plus important encore comment la réparer ou l'éviter de se produire.Problème Winforms - Erreur lors de la création du handle de fenêtre

 
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) 

Répondre

42

Avez-vous exécuté Process Explorer ou le Gestionnaire des tâches de Windows pour examiner les objets GDI Objects, Handles, Threads et USER? Si ce n'est pas le cas, sélectionnez les colonnes à afficher (Gestionnaire des tâches choisissez Affichage-> Sélectionner les colonnes ... Puis lancez votre application et jetez un oeil à ces colonnes pour voir si l'une de ces colonnes est réellement grande. il est peut-être que vous avez composants d'interface utilisateur que vous pensez sont nettoyés mais ne sont pas écoulés.

Here's a link sur ce qui pourrait être utile.

Bonne chance!

+1

J'ai rencontré ce problème et trouvé que mon application rapportait 9600+ objets utilisateur et 1800+ objet GDI. Mon problème est que je ne fais rien de mal, j'ajoute juste beaucoup d'éléments à un FlowLayoutPanel. Je suppose que je vais devoir 'paginer' les données affichées ... –

1

Je pense que cela est normalement lié à un manque de mémoire sur l'ordinateur, donc il n'est plus capable de créer d'autres poignées de fenêtres. Normalement, Windows commence à montrer un comportement étrange à ce stade.

+0

des choses sur lesquelles se concentrer. . . – leora

-1

sORTIR de la suggestion de la mémoire ne semble pas être une mauvaise avance

Que fait votre programme pour qu'il reçoive cette erreur?

Crée-t-il un grand nombre de fenêtres ou de contrôles? Est-ce qu'il les crée par programme, par opposition à la conception? Si oui, faites-vous cela en boucle? Est-ce que cette boucle est infinie? Consommez-vous d'énormes quantités de mémoire d'une autre manière? Que se passe-t-il lorsque vous regardez la mémoire utilisée par votre application dans le gestionnaire de tâches? Est-ce que ça monte en flèche vers la lune? Ou mieux encore, comme suggéré ci-dessus, utilisez le moniteur de processus pour plonger dans les détails.

21

La limite de poignée Windows pour votre application est de 10 000 handles. Vous obtenez l'erreur car votre programme crée trop de handles. Vous aurez besoin de trouver la fuite de mémoire. Comme d'autres utilisateurs l'ont suggéré, utilisez un profileur de mémoire. J'utilise aussi le .NET Memory Profiler. En outre, assurez-vous que vous appelez la méthode disposer sur les contrôles si vous les supprimez d'un formulaire avant le formulaire se ferme (sinon les contrôles ne disposeront pas). Vous devrez également vous assurer qu'aucun événement n'est enregistré avec le contrôle. J'ai moi-même le même problème, et malgré ce que je sais déjà, j'ai encore des fuites de mémoire qui continuent à m'échapper ..

0

J'ai la même erreur dans mon application.Je charge de nombreux contrôles en une seule page.In événement de clic sur un bouton J'efface les commandes. Le fait d'effacer les commandes ne libère pas les commandes de la mémoire. Je viens de commenter la méthode controls.clear() et d'inclure quelques lignes de code pour disposer les contrôles. Quelque chose comme ça

pour chaque ctl que le contrôle dans ControlCollection

ctl.disposer()

Suivant

5

Ce problème est presque toujours lié au nombre d'objets GDI, le nombre d'objets utilisateur ou poignée compte et généralement pas en raison d'une condition hors de la mémoire sur votre machine. Lorsque je suis en train de suivre un de ces bogues, j'ouvre ProcessExplorer et je regarde ces colonnes: poignées, fils, objets GDI, objets USER, octets privés, taille virtuelle et ensemble de travail.

(Dans mon expérience, le problème est généralement une fuite d'objet en raison d'un gestionnaire d'événements tenant l'objet et l'empêchant d'être éliminés.)

2

Eh bien, dans mon cas, il était sans aucun doute les objets utilisateur qui étaient hors de contrôle. J'ai regardé dans le Gestionnaire des tâches de Windows et bien sûr, le nombre d'objets USER était à 10'000 exactement. Je incorpore dynamiquement la propriété et les feuilles de liste dans les pages d'onglets en définissant la propriété Parent de la propriété ou du panneau de conteneur de la feuille de liste sur celle de la page d'onglets. Je suis en train de recycler ou de recréer sous condition les formulaires de propriété et de liste en fonction du type de collection listé ou du type de classe de l'objet inspecté. NB: En Delphi, tous les contrôles avaient une propriété Owner et une propriété Parent. Même si l'on changeait la propriété Parent d'un contrôle, il serait toujours éliminé par son propriétaire lorsque le contrôle propriétaire serait détruit.

En C#, il semble que si un contrôle, par ex. un Panel est réaffecté par programme depuis, par exemple, un formulaire à une page d'onglets en changeant la propriété Panel.Parent, en appelant Dispose() sur le formulaire ne disposera pas du Panel, et n'appellera pas Controls.Clear() sur la page Tab. Même un appel direct à Panel.Dispose() ne le disposera pas réellement, à moins que son Parent ne soit préalablement mis à zéro manuellement.

1

J'ai ajouté un chèque qui le fait fonctionner ...

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

il est toujours vrai, mais la forme plaids une erreur sans cela. BTW, mon handle est d'environ 4,9 millions

+0

Notez que l'implémentation de la propriété Handle vérifie si le handle est créé et, dans le cas contraire, le crée. Vous cherchez dans le code source .NET: 'IntPtr Handle public {get {... if (! This.IsHandleCreated) {this.CreateHandle(); } ...}} 'La propriété' IsHandleCreated' vous retournera vrai/faux sans créer le handle. –

Questions connexes