IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Libérer la Mémoire avant rafraichissement


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Par défaut Libérer la Mémoire avant rafraichissement
    Bonjour Bonjour,

    J'ai une application VB.NET Framework2 qui utilise un tabControl pour, comme son nom l'indique, afficher des onglets.
    A chaque fois qu'on qu'on change d'onglet, je fais une sorte de refresh.

    Je REMOVE les éléments un à un,
    Je récupère le tableau d'élément de chaque onglet,
    et je repositionne les éléments.

    Je fais surement mal les choses, mais faut pas que je passe trop de temps non plus sur ce projet ^^

    Après quelque heure d'utilisation, le programme sature la mémoire.
    Donc je me demande comment libérer de la mémoire.

    J'ai trouvé la méthode DISPOSE pour libérer l'objet de la mémoire.
    Soit le remplace le REMOVE, soit je fais un DISPOSE de mon tabcontrol... Je peux tester tout çà demain sur site.

    Donc je vous demande conseil avant si vous avez une idée.
    N'hésitez pas si vous voulez plus de détails.

    Cordialement

  2. #2
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Ce n'est probablement pas à proprement parler les tabcontrol qui posent problème.
    Es-tu sûr de n'avoir pas une fuite de mémoire due à une erreur de logique dans ton appli ?
    Regarde du côté des boucles, des méthodes de traitement de fichier, etc.

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    pour les classes qui ont la méthode dispose, il vaut mieux l'appeler dès que possible pour libérer la mémoire

    quand on veut supprimer un controle, on peut faire .remove, mais il faut aussi le disposer
    à noter que faire .dispose directement retire aussi le controle ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Au temps pour moi, je pensais qu'on parlait d'ASP.NET.
    Dans ce cas, les conseils de Pol63 seront bien plus avisés que les miens.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Par défaut
    Bon alors voici l'algo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Tous les onglets
    	Tous les controls
    		=>Remove
     
    	Each TableLayoutPanel
    		Dimenssion du tableau de brique (couleur, hauteur, tag)
     
    	Requête SQL pour récupérer éléments dans un tableau()
     
    	Création d’autant de brique invisible (DLL) qu’il y a d’élément dans le tableau.
     
    	Définir Scrollbar
     
    	PlacerBrique() ‘rendre visible la brique à la bonne position…
    Donc à part le Remove control, ou le tableau de brique, je ne vois pas trop quoi vider

    voici le détail du code pour ces deux parties:

    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                'Effacer les briques SAUF la zone tampon
                Dim nb_controls As Integer = Me.TabControl.TabPages(i).Controls.Count - 1
                Dim j As Integer
                Dim k As Integer = 0
                For j = 0 To nb_controls
     
                    Dim BR As Control = Me.TabControl.TabPages(i).Controls(k)
                    If TypeOf (BR) Is WindowsLibraryBricks.Brique Then
                        Me.TabControl.TabPages(i).Controls.Remove(BR)
                    Else
                        k = k + 1
                    End If
     
                Next
    ==> doit on faire ceci :
    Me.TabControl.TabPages(i).Dispose() ???

    - Dim lb() As Donnees.Brique
    Passe par un datatable, puis parcourt chaque ligne/colonne pour remplir le tableau
    ==> Doit on effacer le tableau avant de le recréer ?
    ==> Doit on effacer le datable a la fin ?

    Merci d'avance

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    pour les classes qui ont la méthode dispose, il vaut mieux l'appeler dès que possible pour libérer la mémoire

    quand on veut supprimer un controle, on peut faire .remove, mais il faut aussi le disposer
    à noter que faire .dispose directement retire aussi le controle ...
    ca me parait assez clair mais je vais résumer
    tu n'as plus besoin d'un truc, s'il a une méthode dispose tu l'appelles
    les controles l'ont donc il faut l'appeler si tu n'en as plus besoin, le datatable sauf erreur de ma part ne l'a pas donc il est libéré automatiquement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Encadre tes modifications sur le control parent par Control.Suspendlayout et Control.Resumelayout.
    Cela evite au moteur graphique un ralentissemen(il doit refaire la peinture de nombreux controles).
    MSDN:
    Les méthodes SuspendLayout et ResumeLayout sont utilisées en tandem pour supprimer les événements Layout multiples lorsque vous ajustez plusieurs attributs du contrôle. Par exemple, vous appelez généralement la méthode SuspendLayout puis définissez les propriétés Size, Location, Anchor ou Dock du contrôle et appelez ensuite la méthode ResumeLayout pour que les modifications prennent effet.
    Lors de l'ajout de plusieurs contrôles à un contrôle parent, il est recommandé d'appeler la méthode SuspendLayout avant d'initialiser des contrôles à ajouter. Après l'ajout des contrôles au contrôle parent, appelez la méthode ResumeLayout. Cela améliorera les performances des applications comportant de nombreux contrôles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Private Sub AddButtons()
       ' Suspend the form layout and add two buttons.
       Me.SuspendLayout()
       Dim buttonOK As New Button()
       buttonOK.Location = New Point(10, 10)
       buttonOK.Size = New Size(75, 25)
       buttonOK.Text = "OK"
     
       Dim buttonCancel As New Button()
       buttonCancel.Location = New Point(90, 10)
       buttonCancel.Size = New Size(75, 25)
       buttonCancel.Text = "Cancel"
     
       Me.Controls.AddRange(New Control() {buttonOK, buttonCancel})
       Me.ResumeLayout()
    End Sub
    bon code....

  8. #8
    Membre éprouvé Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Par défaut
    tu peux forcer la libération en demandant au Garbage Collector d'entrer en action immédiatement en appelant la méthode collect

    Cette méthode n'est en général pas recommandé car elle consomme beaucoup de ressource sur le système.

Discussions similaires

  1. Libérer la mémoire en multi-thread
    Par Nathan dans le forum Général Python
    Réponses: 2
    Dernier message: 17/10/2006, 12h36
  2. problème Mémoire avant appel au main ?
    Par benhoeil dans le forum C
    Réponses: 18
    Dernier message: 13/10/2006, 11h24
  3. Libérer la mémoire allouée à un objet
    Par boudou dans le forum Langage
    Réponses: 6
    Dernier message: 21/02/2006, 22h25
  4. Réponses: 10
    Dernier message: 01/12/2005, 11h50
  5. Comment libérer la mémoire d'un TList ?
    Par Tchaill39 dans le forum Langage
    Réponses: 8
    Dernier message: 16/11/2005, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo