61 votes

Problème Winforms - Erreur lors de la création de la poignée de la fenêtre

Nous observons cette erreur dans une application Winform. Est-ce que quelqu'un peut aider à comprendre pourquoi cette erreur se produit, et surtout comment la corriger ou l'éviter.

System.ComponentModel.Win32Exception: Erreur de création de la poignée de fenêtre.
   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)

51voto

itsmatt Points 18905

Avez-vous exécuté Process Explorer ou le Gestionnaire des tâches Windows pour regarder les Objets GDI, les Poignées, les Threads et les objets USER? Si ce n'est pas le cas, sélectionnez ces colonnes à afficher (dans le Gestionnaire des tâches, choisissez Affichage->Sélectionner les colonnes...). Ensuite, exécutez votre application et jetez un œil à ces colonnes pour cette application et voyez si l'une d'entre elles est en train de grandir de manière significative.

Il se peut que vous ayez des composants d'interface utilisateur que vous pensez avoir nettoyés mais qui n'ont pas été Disposés.

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

Bonne chance!

26voto

mjezzi Points 128

La limite de poignées de fenêtre pour votre application est de 10 000 poignées. Vous obtenez l'erreur car votre programme crée trop de poignées. Vous devrez trouver la fuite de mémoire. Comme d'autres utilisateurs l'ont suggéré, utilisez un profileur de mémoire. J'utilise également le profileur de mémoire .Net. Assurez-vous également d'appeler la méthode dispose sur les contrôles si vous les supprimez d'un formulaire avant que le formulaire se ferme (sinon les contrôles ne se disposeront pas). Vous devrez également vous assurer qu'il n'y a aucun événement 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 toujours des fuites de mémoire qui continuent de me passer..

11voto

Fabrice Points 1581

Voir cet article sur "Erreur de création de poignée de fenêtre" et comment il est lié aux objets USER et au tas du bureau. Je propose quelques solutions.

6voto

AlfredBr Points 585

Ce problème est presque toujours lié au nombre d'objets GDI, au nombre d'objets utilisateur ou au nombre de poignées et pas à une condition de manque de mémoire sur votre machine.

Lorsque je traque l'un de ces bugs, j'ouvre ProcessExplorer et surveille ces colonnes : Poignées, Threads, Objets GDI, Objets utilisateur, Octets privés, Taille virtuelle et Mémoire vive.

(Dans mon expérience, le problème est généralement une fuite d'objets due à un gestionnaire d'événements maintenant l'objet et l'empêchant d'être libéré.)

1voto

xlthim Points 11

J'ai ajouté une vérification qui fait fonctionner...

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

c'est toujours vrai, mais le formulaire lance une erreur sans cela. BTW, mon handle est autour de 4,9 millions

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X