2010-08-06 7 views
0

J'essaie d'implémenter des classes TabControl/TabPage améliorées, afin d'obtenir une fonctionnalité TabVisible réelle, puisque la propriété Visible de TabPage ne fonctionne pas comme prévu.Solution de contournement TabVisible - fuites de mémoire

Je travaille avec C#/WinForms/VS2005/.Net FW 2.0; Je l'ai mis en œuvre le code de cette façon:

http://csharp.pastebin.com/AUnzRQLw

Et je l'ai fait un formulaire pour le tester, cochant/décochant cases à cocher pour afficher/masquer certains contrôles VisibleTabPage J'ai ajouté (http ..// csharp.pastebin.com/MkGJGx2G). Mais, après un certain nombre de clics sur CheckBoxes, dans une séquence aléatoire, l'application commence à allouer de plus en plus de mémoire, et utilise une quantité considérable de CPU pour afficher/masquer les contrôles TabPage.

Quelqu'un peut-il me signaler où est le bogue?

+0

Je suggère de vérifier si vous réinitialisez vos pages d'onglets lorsque l'état de la case à cocher a changé. Le meilleur moyen de vérifier cela serait de télécharger un bon profileur (Windbg etc.) et de découvrir quels objets existent en mémoire. –

+0

Oui, j'ai utilisé un profileur de mémoire et j'ai trouvé que l'objet ArrayList était le coupable. J'ai créé une ArrayList privée que je conserve pendant toute la durée de vie de l'objet TabControlEx, ce qui a résolu le problème. – Alexandre

Répondre

1

C'est un peu trop de code à traverser. Cependant, je vois que vous utilisez des méthodes comme Remove() et Clear() sans jamais avoir appelé la méthode Dispose() pour une page à onglets. Ces pages sont "parquées" et continueront à utiliser les ressources du système. Exécutez Taskmgr.exe, onglet Processus, Affichage + Sélectionner les colonnes, cochez les objets User32. Vous verrez probablement ce nombre monter sans limite car votre code fuit le Handle pour la page à onglet et tous ses contrôles.

+0

J'ai trouvé le bogue, c'était le ArrayList qui a été initialisé beaucoup de fois. J'ai créé une ArrayList privée que je conserve pendant toute la durée de vie de l'objet TabControlEx, ce qui a résolu le problème. Merci quand même pour le pourboire. – Alexandre