Problème de libération de mémoire avec un UserControl [Résolu]

rbidocho 41 Messages postés jeudi 7 juin 2007Date d'inscription 15 septembre 2008 Dernière intervention - 13 juin 2007 à 11:14 - Dernière réponse : rbidocho 41 Messages postés jeudi 7 juin 2007Date d'inscription 15 septembre 2008 Dernière intervention
- 13 juin 2007 à 11:54
Bonjour,

ma config : Win XP SP1 .Net Framework 1.1
IDE et Programmation: SharpDevelop 1.1 en VB.NET

Mon petit souci :

Depuis mon MainForm, j'appelle une classe qui insère un UserControl (graphique en bmp dans un panel) dans mon MainForm.
Cet Appel peut se faire (et se fait) plusieurs fois.
Jusqu'ici pas de problème.

Le problème survient quand je veux supprimer le UserControl tout en libérant la mémoire :

voici le code (épuré) de la procédure qui est dans le MainForm
            Public Sub Tracer()

                   'Effacement du UserControl si il existe
                For Each Ctrl As system.Windows.Forms.Control In Me.tabPageCourbePolluants.Controls
                    If Ctrl.Name = "UcGraphXY" Then
                        Me.tabPageCourbePolluants.Controls.Ctrl.remove (Ctrl)
                    End If
                Next

                Dim UcG as UcGraphXY = new UcGraphXY
                    'lignes de contruction de mon UserControl

                'Ajout du UserControl dans mon MainForm
                Me.tabPageCourbePolluants.Controls.Add(UcG)
            End Sub

Donc si j'ai bien compris, je ne fais que supprimer visuellement le UserControl mais cela ne libère pas la mémoire (Augmentation de 3MO à chaque appel).

Si vous avez une solution, je vous en remercie d'avance

RB
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
cs_niky 168 Messages postés jeudi 28 juin 2001Date d'inscription 18 octobre 2008 Dernière intervention - 13 juin 2007 à 11:32
3
Merci
Salut,

Si tu ajoutes Ctrl.Dispose juste à après l'appel à remove, tu demandes à ton objet de libérer les ressources non managées qu'il utilise. En surchargeant la méthode Dispose dans ton UserControl, tu peux aussi libérer tes propres objets (par exemple l'image bitmap).
La mémoire sera peut être libérée...

Sinon, comme .Net gère lui-même la mémoire, il se chargera bien à un moment de collecter ton objet.
Tu peux le forcer en appelant System.GC.Collect... mais c'est pas très recommandé.

Merci cs_niky 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_niky
rbidocho 41 Messages postés jeudi 7 juin 2007Date d'inscription 15 septembre 2008 Dernière intervention - 13 juin 2007 à 11:54
0
Merci
Merci Niky pour cette rapide reponse.


J'ai donc rajouté Ctrl.Dispose()


et dans ma classe :

        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

            If disposing Then

                If Not (components Is Nothing) Then

                    components.Dispose()

                End If

            End If

            MyBase.Dispose(disposing)

        End Sub

       

et la mémoire semble être relativement constante
Commenter la réponse de rbidocho

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.