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 6 et antérieur Discussion :

[VB]Libération de la mémoire


Sujet :

VB 6 et antérieur

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut [VB]Libération de la mémoire
    Bonjour !
    J'ai un problème en visual basic, mon listview charge une enorme quantité de donnée à partir d'un recordset. Lorsque que je lance visual basic la première fois, le listview se charge en quelques secondes, puis les fois suivante il met quelques secondes de plus jusqu'à mettre preque 1 minute. Mais lorque que je ferme VB et que je l'ouvre à nouveau, le chargement se fait rapidement à nouveau. Je pense que c'est un problème de mémoire qui n'est pas vidé. Est-ce que vous êtes d'accord ? Y a-t-il une solution. Pourtant je libère bien la mémoire du recordset en faisant recordset.close:set recordset = nothing. Y a-t-il autre chose à faire ?

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello,
    J'ignore ce qu'il en est de VB6 mais il est possible d'utiliser des variables sans les déclarer en VBA. Ça, ça prend de la mémoire surtout si tu les utilises dans une boucle. Ensuite, les gotos ne sont jamais dépilés. Ça aussi prend de la mémoire si tu utilises la gestion d'erreurs comme moyen de programmation. Préfère resume next avec test de l'erreur. Les variables globales itout en étant trainées tout au long de l'exécution du programme... Et certainement d'autres choses encore qui ne me reviennent pas à l'esprit.
    Donc, le principe
    1 - Déclarer toutes les variables (option explicit)
    2 - Eviter les gotos comme moyen de programmation (à limiter aux erreurs imprévues)
    3 - Limiter les variables globales
    4 - ... liste non exhaustive

    Si ça peut évoquer quelque chose

    A+

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    Salut !
    Pour l'option explicit c'est vrai que je l'avais oublié... Donc à présent toutes mes variables sont déclarées, (en locale pour celles de la boucle)... Mais j'ai toujours le meme soucis... je n'utilise aucun goto. ce qui ai bizar c'est que plus la procédure est lancée et plus le temps augmente... le seul moyen c'est de fermer complètement mon projet, comme s'il libérer de la mémoire...

    Voila ma procedure :


    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    Private Sub AfficherListe()
        Dim RstProt As New ADODB.Recordset
        Dim Rstnorech As New ADODB.Recordset 
        Dim Valeur As String
        Dim Ligne As MSComctlLib.ListItem
        Dim CollectionLigne As MSComctlLib.ListItems
        Dim nbrecord As Integer
        Dim req As String
        Dim rep As String
        Dim novalide As Integer
     
        Me!BarreStatutProtections.Panels(1).text = "Recherche en cours..."
     
        'Requete
        req = Requete SQL
     
        ValidateRect ListViewProtection.hwnd, 0&   'On inhibe le rafraichissement écran
     
        nbrecord = 0
     
        With RstProt
            .Open req, SqlSrvDatabase, adOpenKeyset, adLockReadOnly
            Set CollectionLigne = Me!ListViewProtection.ListItems
            CollectionLigne.Clear
     
            Me!BarreStatutProtections.Panels(1).text = " Chargement de la liste..."
     
            'Chargement de la ListView à partir de la requete Lignelic
            While Not .EOF
                Valeur = NoZ(!champ1): Set Ligne = CollectionLigne.Add(, , Valeur)
                Ligne.Tag = Valeur
                Valeur = NoZ(!Champ2): Ligne.SubItems(1) = Valeur
                Valeur = NoZ(!champ3): Ligne.SubItems(2) = Valeur
                If Valeur = "Expiré" Then
                    Ligne.ListSubItems(2).ForeColor = vbRed
                Else
                    If Valeur = "En attente" Then
                        Ligne.ListSubItems(2).ForeColor = vbBlue
                    End If
                End If
                Valeur = NoZ(!champ4): Ligne.SubItems(3) = Valeur
                Valeur = NoZ(!champ5): Ligne.SubItems(4) = Valeur
                ...
                Valeur = NoZ(!champ22): Ligne.SubItems(21) = Valeur
                nbrecord = nbrecord + 1
                .MoveNext
            Wend
            .Close
        End With
     
        Set RstProt = Nothing
        Set CollectionLigne = Nothing
        Set Ligne = Nothing
        InvalidateRect ListViewProtection.hwnd, 0&, 0&  'On active le     rafraichissement écran
        Me!BarreStatutProtections.Panels(1).text = nbrecord & " élément(s) listé(s)"

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Désolé mais je ne vois pas. Il existe (existait en 1990) un outil qui permettait déjà de suivre l'évolution de la mémoire durant l'exécution d'un programme mais j'ignore s'il est accessible en VB. Devrait bien exister quelque part...
    Juste un truc, pour "Ligne = .SubItems(...)", tu es obligé de passer par valeur ? (certainement, mais je n'ai pas saisi pourquoi)
    Rien que pour voir, tu peux aussi réinitialiser toutes tes variables temporaires en fin de sub... mais là, je doute que cela ait une influence.

    Il y aura bien quelqu'un qui sait tout ça... et comme ça m'intéresse, je suivrai les réponses

    Bonne chance

    A+


    PS - Tu n'as pas une tempo dans une autre routine ?

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    qu'est-ce que tu entends par tempo ?

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Un appel à un timer...

  7. #7
    Dnx
    Dnx est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 290
    Points : 154
    Points
    154
    Par défaut
    a tout hasard, ta requête sql remonte combien de ligne?

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    Non je n'ai pas de boucle avec timer.

    La requete remonte 22000 enregistrements !! c'est beaucoup, mais pourquoi la première fois ça met 10 secondes et apres de plus en plus... ça devrait mettre toujours le meme temps... Par contre en fermant VB et en le relançant, ça doit vider la memoire vive et apres ça remarche bien en 10 secondes...

  9. #9
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    La libération de la mémoire, n'est sans doute pas efficace. Il faudrait (sa)voir comment fonctionne le ramasse miettes de VB.

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    mais normalement je devrais pas avoir besoin du ramasse miette puisque que j'initialise mes variables à nothing à chaque fois... Je veux bien essayer tout de meme mais ou est-ce que je peux trouver des infos sur le ramasse miette ?

  11. #11
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Cer n'est qu'une hypothèse.

    D'autre part le problème peut venir du controle listView et non du recordset.

  12. #12
    Membre habitué Avatar de Mandalar
    Profil pro
    Étudiant
    Inscrit en
    Mai 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2004
    Messages : 121
    Points : 128
    Points
    128
    Par défaut
    Si tu parles lors de l'éxecution via l'éditeur, le probleme peut venir de la facon dont tu quitte l'appli.
    Si tu cliques sur "fin" dans l'éditeur, le programme s'arrete mais les procédure de fin (form_unload, queryunload etc) ne sont pas appelées.
    Il est probable que de la meme maniere la mémoire ne soit pas libérée.
    Sinon essaye en compilant pour voir si tu as le meme probleme.

  13. #13
    Membre actif Avatar de AdHoc
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 245
    Points : 239
    Points
    239
    Par défaut
    Bonjour,
    je pense comme catbull.
    Un moyen simple de verifier:
    essaye ton code en utilisant un controle listbox simple et en l'utilisant directement.

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    En fait le problème doit bien venir du listview, je l'ai remplacé par un mshflexgrid, et ça marche tres bien.

    Sauf qu'avec le mshflexgrid, la roulette de la souris ne fonctionne pas ! Y'a toujours un truc qui va pas en fait...

Discussions similaires

  1. LIbération de la mémoire
    Par Premium dans le forum C
    Réponses: 3
    Dernier message: 27/11/2006, 10h33
  2. Libération de la mémoire
    Par Premium dans le forum C
    Réponses: 4
    Dernier message: 09/08/2006, 18h15
  3. [CSV] Libération de la mémoire
    Par cedricgirard dans le forum Langage
    Réponses: 7
    Dernier message: 05/01/2006, 12h02
  4. libération de la mémoire après traitement ?
    Par isachat666 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2005, 19h29
  5. Libération de la mémoire
    Par gibet_b dans le forum Composants VCL
    Réponses: 3
    Dernier message: 30/06/2004, 12h02

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