Winforms issue-erreur création de la poignée de fenêtre [dupliquer]

cette question a déjà une réponse ici:

nous voyons cette erreur dans une application Winform. N'importe qui peut aider sur pourquoi vous voyez cette erreur, et surtout comment le résoudre ou d'éviter qu'elle se produise.

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)
53
demandé sur Yi Jiang 2008-10-21 21:01:13

10 réponses

avez-vous lancé Process Explorer ou Windows Task Manager pour regarder les objets GDI, les poignées, les Threads et les objets utilisateur? Sinon, sélectionnez les colonnes à visualiser (Gestionnaire des Tâches, choisissez Affichage->Sélectionner les Colonnes... Puis lancez votre application et jetez un coup d'oeil à ces colonnes pour cette application et voir si l'un d'eux se développe vraiment grand.

il se peut que vous ayez des composants D'UI que vous pensez sont nettoyés mais n'ont pas été éliminés.

voici un lien à ce sujet qui pourrait être utile.

Bonne Chance!

46
répondu itsmatt 2008-10-21 18:06:09

la limite de poignée de fenêtres pour votre application est 10.000 poignées. Vous obtenez l'erreur parce que votre programme crée trop de poignées. Vous devez trouver la fuite de mémoire. Comme d'autres utilisateurs l'ont suggéré, utilisez un profileur de mémoire. J'utilise aussi le profileur de mémoire.Net. Aussi, assurez-vous que vous appelez la méthode disposer sur les contrôles si vous les retirez d'un formulaire avant le formulaire se ferme (sinon les contrôles ne seront pas disposer). Vous aurez également à faire assurez-vous qu'il n'y a pas d'événements enregistrés 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 quelques fuites de mémoire qui continuent de m'échapper..

22
répondu mjezzi 2010-07-30 18:43:58

Voir ce billet sur mon blog à propos de "Erreur de création du handle de fenêtre" et comment il se rapporte à des Objets UTILISATEUR et le Segment de Bureau. Je propose quelques solutions.

11
répondu Fabrice 2009-08-08 00:35:37

ce problème est presque toujours lié au nombre D'objets GDI, au nombre D'Objets utilisateurs ou au nombre de manipulations et habituellement pas en raison d'une condition de mémoire hors de votre machine.

quand je traque un de ces bogues, j'ouvre ProcessExplorer et je regarde ces colonnes: les poignées, les Threads, les objets GDI, Les Objets utilisateurs, les octets privés, la taille virtuelle et le jeu de travail.

(d'après mon expérience, le problème est généralement une fuite d'objet due à un handler d'événement tenant l'objet et l'empêchant d'être disposé.)

5
répondu AlfredBr 2010-02-08 20:02:27

dans mon cas, c'était certainement les objets utilisateurs qui étaient hors de contrôle. J'ai regardé dans le Gestionnaire des tâches Windows et bien sûr, le nombre D'Objets utilisateurs était à 10'000 exactement.

je suis en train d'intégrer dynamiquement les propriétés et les feuilles de liste dans les pages D'onglet en définissant la propriété mère du panneau de conteneur de la propriété ou de la feuille de liste à celle de la Page D'onglet. Je suis le recyclage conditionnel ou recréer la propriété et les formulaires de feuille de liste selon le type de collection en cours d'énumération ou type de classe de l'objet inspecté.

NB: à Delphi, tous les contrôles avaient un propriétaire et une propriété mère. Même si l'on changeait la propriété mère d'un contrôle, il serait quand même aliéné par son propriétaire lorsque le contrôle propriétaire a été détruit.

En C#, il semble que si un contrôle par exemple, un Panneau est par programmation réaffectés à partir de, disons, un Formulaire à une Page de l'Onglet en changeant le Panneau.Propriété mère, appelant Dispose () sur le formulaire ne pas jeter le Panneau, ni l'appel de Contrôles.Clear () sur la page de L'onglet. Même un panneau d'appel direct.Dispose () ne le disposera pas réellement, à moins que son Parent ne soit défini manuellement à null à l'avance.

2
répondu kingsley 2010-03-18 12:38:47

je pense que c'est normalement lié au fait que l'ordinateur n'a plus de mémoire, donc il ne peut plus créer de poignées de fenêtre. Normalement, windows commence à montrer un comportement étrange à ce point.

1
répondu AtliB 2008-10-21 17:13:34

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

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

c'est toujours vrai, mais la forme renvoie une erreur sans elle. BTW, ma poignée est d'environ 4,9 millions de

1
répondu xlthim 2012-03-21 19:32:03

j'ai eu la même erreur dans mon application.Je charge de nombreuses commandes en une seule page.Dans le claquement de bouton d'événement je nettoie les contrôles.Effacer les contrôles ne libère pas les contrôles de la mémoire.Donc, éliminez les commandes de mémoire. J'ai juste commenté contrôles.clear () méthode et inclure quelques lignes de code pour éliminer les contrôles. Quelque chose comme ça

pour chaque ctl comme commande dans la collection de commande

ctl.Eliminer()

Suivant

0
répondu 2009-09-01 19:10:53

Certainement trop de poignées(problème de fuite de mémoire):

IL Jungles: le Système.ComponentModel.Win32Exception: erreur créant la poignée de fenêtre

0
répondu user344760 2014-04-29 15:41:08

la suggestion hors de la mémoire ne semble pas être une mauvaise piste.

Que fait votre programme pour qu'il obtienne cette erreur?

crée-t-il un grand nombre de fenêtres ou de contrôles? Est-il les créer par programmation plutôt au moment de la conception? Si oui, faites-vous cela en boucle? C'est que la boucle infinie? Etes-vous consommer des stupéfiante d'y chercher de la mémoire d'une autre façon?

Ce qui se passe quand vous regardez la mémoire utilisée par votre application dans le gestionnaire des tâches? Fait monter en flèche à la lune? Ou encore mieux, comme suggéré ci-dessus, utilisez process monitor pour plonger dans les détails.

-2
répondu rice 2008-10-21 18:11:55