Win32Exception Pas assez de stockage disponible pour traiter cette commande
Par le biais de mon automatisé crash collection pour MaxTo j'ai eu la suite de rapport de crash:
V8.12.0.0 - System.ComponentModel.Win32Exception - :Void UpdateLayered():0
Version: MaxTo8.12.0.0
Exception: System.ComponentModel.Win32Exception
Error message: Not enough storage is available to process this command
Stack trace:
at System.Windows.Forms.Form.UpdateLayered()
at System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
at System.Windows.Forms.Control.WmCreate(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmCreate(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at MaxTo.MainForm.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Un autre stacktrace:
Version: MaxTo2009.9.0.0
Exception: System.ComponentModel.Win32Exception
Error message: Not enough storage is available to process this command
Stack trace:
at System.Windows.Forms.Form.UpdateLayered()
at System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
at System.Windows.Forms.Control.WmCreate(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmCreate(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Dans cette dernière trace de la pile il n'y a aucune référence à MaxTo à tous, et 90% des collisions que je reçois sont avec des traces de pile similaire à ci-dessus.
Fouiller sur le net, j'ai trouver que cette erreur est d'habitude si vous oubliez de le rejet ou l'élimination des variables. Lors de la recherche par le biais de mon WndProc
qui semble avoir parfois le problème de passer à travers, je ne trouve pas un seul endroit qui pèse sur les références à des objets. Toutes les variables sont locales à WndProc, et doivent donc être nettoyés lorsque la méthode se termine.
protected override void WndProc(ref Message m)
{
base.WndProc(ref m); //I'm assuming the first trace can be caught here
IntPtr hwnd = m.WParam;
//Our hook tells us something got maximized
if (Win32Import.UWM_MAXIMIZE == (UInt32)m.Msg)
{
//Figure out if we are temporarily disabled or using alternative profiles
KeyStateInfo keyState = KeyboardInfo.GetKeyState(Settings.AlternativeProfileKey);
Rectangle r = FindRectangle(MousePosition, (Settings.EnableAlternativeProfile && keyState.IsPressed ? AlternativeRegions : Regions));
//Did we find a rectangle to place it in?
if (r != Rectangle.Empty)
{
Rectangle position = Win32Import.GetWindowRectangle(hwnd);
Rectangle previousPos = GetLocation(hwnd);
if (position == r && previousPos != Rectangle.Empty)
{
//We are restoring the original position
Win32Import.SetWindowPos(hwnd, IntPtr.Zero, previousPos.X, previousPos.Y, previousPos.Width, previousPos.Height, Win32Import.SWP_NOZORDER | Win32Import.SWP_NOSENDCHANGING);
}
else
{
//We are maximizing to a region
Win32Import.ShowWindow(hwnd, Win32Import.WindowShowStyle.Restore);
Win32Import.SetWindowPos(hwnd, IntPtr.Zero, r.X, r.Y, r.Width, r.Height, Win32Import.SWP_NOZORDER | Win32Import.SWP_NOSENDCHANGING);
//Make sure we remember this location
RememberLocation(hwnd, position);
}
}
}
else if (MaxTo64WindowHandleMessage == m.Msg)
{
//Store the window handle of our 64-bit subprocess
SubProcess64WindowHandle = m.WParam;
}
}
Je n'ai pas été en mesure de reproduire l'erreur, même lors de l'exécution du programme au cours de plusieurs jours.
Mon hypothèse est que le système est faible, soit fragmenté de la mémoire ou GDI poignées, mais je ne peux pas confirmer cela n'importe où. Il ne semble pas être une bonne documentation sur cette erreur.
Aucune idées de ce qu'elle pourrait être? Puis-je faire quelque chose pour éviter cette erreur?
Mise à jour: La question a été rouvert avec plus de traces de pile, en raison de l'absence d'une solution décente. De simplement l'ignorer ne résout pas le problème.
source d'informationauteur Vegard Larsen
Vous devez vous connecter pour publier un commentaire.
La fuite ou à l'aide de nombreux objets GDI/poignées. Ceux-ci pourraient causer un tas de ressources pénurie. Vous pourriez ne pas être en mesure de reproduire parce que vos utilisateurs pourraient avoir d'autres ressources GDI lourds programmes en cours d'exécution ou de l'utilisation du Serveur Terminal server dans ce cas, ils doivent partager quelques des tas avec les autres utilisateurs. Voir Erreur De Système. Code: 8. Pas assez de mémoire disponible pour traiter cette commande
Ici vous pouvez lire sur le Segment de Bureau Moniteur outil pour diagnostiquer bureau tas de problèmes.
Ici et ici et ici sont GDI de détection de fuite d'outils.
Votre programme est probablement une fuite ressources du noyau. Démarrer le diagnostic de ce problème avec Taskmgr.exe. Afficher + de Sélectionner les Colonnes, vérifier les objets, les objets GDI et Gérer le compte. Exécuter votre programme et d'observer si l'un de ces, est en constante augmentation. Une fois que l'un d'entre eux atteint 10.000 votre programme va mourir.
Un moyen de voir rapidement la fuite dans l'action, vous pouvez commencer à commenter le code pour voir où la fuite se produit. Il a probablement quelque chose à voir avec votre "crochet".
Le problème est probablement dones pas de mentir dans votre WndProc - la raison pour laquelle vous voir dans vos piles d'appels est parce qu'à peu près tout ce GUI liés à Windows de passer par la fenêtre WIN32 procédure. Primordial dans votre contrôle vous permet seulement d'un point de crochet de processus de bas niveau de stuff avant de niveau supérieur .NET framework de traitement est terminé.
Cela va être un complète tir dans le noir, mais peut-être ce post pourrait être pertinent? - probablement pas avec ces traces de la pile.
J'ai eu beaucoup de Fenêtres sur mesure, avec des commandes de ressources propres, de sorte que lorsque je crée de nombreux contrôles cette erreur s'affiche. Pour résoudre ce problème
J'ai fait le fichier Ressource dans ma bibliothèque et utilisés à l'extérieur des ressources au lieu de ressources sur mon code du composant.
Après que mon exception est parti, déjà testé avec 3 fois plus ouvert formes et cette erreur disparu.
Regarde donc comme c'est une solution.