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 :

[VB6] Fuite Mémoire


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Par défaut [VB6] Fuite Mémoire
    Bonjour,

    J'utilise actuellement un programme qui détecte l'insertion de carte d'identitée électronique dans un lecteur.
    Cependant j'ai remarqué qu'après un certain temps l'application gelait, en regardant d'un peu plus près ce problème, je me suis rendu compte que en fait elle prenait de plus en plus de mémoire.

    j'utilise la librairie suivante pour la lecture.
    EIDLIB

    Un timer relance a chaque fois la procédure de lecture.
    J'ai bien fais pour chaque variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim ... as EIDLIBCTRLLibCtl.MapCollection
    ....
    Set ... = nothing
    Il faut également fermer la librairie (je le fais)

    Quand je ferme la form de lecture, l'application revien a une utilisation de mémoire normale.

    Quelqu'un aurait une idée?

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Par défaut
    file nous le code

  3. #3
    Membre émérite
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Par défaut
    Cfr le lien ci dessous pour le SDK et les dll nécéssaires à la lecture de carte a puce...

    ici

    Merci d'avance

    Voici le code...

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Option Explicit
    Option Base 0
     
    Private Const CP_UTF8 = 65001
    Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As String, ByVal cchWideChar As Long) As Long
     
    Function ConvertUTF8(UTF8 As String) As String
        Dim lLen As Long
        Dim strOut As String
        lLen = MultiByteToWideChar(CP_UTF8, 0, UTF8, Len(UTF8), 0, 0)
        strOut = String(lLen * 2, 0)
        MultiByteToWideChar CP_UTF8, 0, UTF8, Len(UTF8), strOut, lLen
        ConvertUTF8 = StrConv(strOut, vbFromUnicode)
    End Function
     
    Private Sub ReadData()
        'On Error GoTo errHandler
        Dim lhandle As Long
        Dim retStatus As EIDLIBCTRLLibCtl.retStatus
        Dim MapColID As New EIDLIBCTRLLibCtl.MapCollection
        Dim MapColAddress As New EIDLIBCTRLLibCtl.MapCollection
        Dim MapColPicture As New EIDLIBCTRLLibCtl.MapCollection
        Dim CertifCheck As New EIDLIBCTRLLibCtl.CertifCheck
     
        Set retStatus = EIDlibCtrl.Init("", -1, -1, lhandle)
     
        If (retStatus.GetGeneral = 0) Then
     
                Set retStatus = EIDlibCtrl.GetID(MapColID, CertifCheck)
     
                If (retStatus.GetGeneral = 0) Then
                    TextName.Text = ConvertUTF8(MapColID.GetValue("Name"))
                    TextGivennames.Text = ConvertUTF8(MapColID.GetValue("FirstName1")) + " " + ConvertUTF8(MapColID.GetValue("FirstName2"))
                    TextGivennames3.Text = ConvertUTF8(MapColID.GetValue("FirstName3"))
                    TextBirthPlace.Text = ConvertUTF8(MapColID.GetValue("BirthPlace"))
                    TextBirthDate.Text = MapColID.GetValue("BirthDate")
                    TextSex.Text = MapColID.GetValue("Gender")
                    TextTitle.Text = ConvertUTF8(MapColID.GetValue("NobilityTitle"))
                    TextNatNr.Text = MapColID.GetValue("NationalNumber")
                    TextIssMunicipality.Text = ConvertUTF8(MapColID.GetValue("IssuingMunicipality"))
                    TextChipNumber.Text = MapColID.GetValue("ChipNumber")
                    TextCardNumber.Text = MapColID.GetValue("CardNumber")
                    TextValidFrom.Text = MapColID.GetValue("BeginValidityDate")
                    TextValidUntil.Text = MapColID.GetValue("EndValidityDate")
                    DoEvents
                Else
                    GoTo quit
    '                MsgBox "ID Failure : " & GetErrorString(retStatus)
                End If
     
                ' Get Address
                Set retStatus = EIDlibCtrl.GetAddress(MapColAddress, CertifCheck)
                If (retStatus.GetGeneral = 0) Then
                    TextStreet.Text = ConvertUTF8(MapColAddress.GetValue("Street")) + " " + MapColAddress.GetValue("HouseNumber") + " " + MapColAddress.GetValue("BoxNumber")
                    TextZip.Text = MapColAddress.GetValue("ZIPCode")
                    TextMunicipality.Text = ConvertUTF8(MapColAddress.GetValue("Municipality"))
                    TextCountry = MapColAddress.GetValue("Country")
                    GoTo quit
                Else
    '                MsgBox "Address Failure : " & GetErrorString(retStatus)
                End If
           End If
     
        GoTo quit
     
    errHandler:
        ' Close library
        EIDlibCtrl.Exit
        MsgBox Err.Description, vbExclamation, "Unknown Read Error"
     
    quit:
    ' Close library
    EIDlibCtrl.Exit
    'Set lhandle = Nothing
    Set retStatus = Nothing
    Set MapColID = Nothing
    Set MapColAddress = Nothing
    Set MapColPicture = Nothing
    Set CertifCheck = Nothing
    Set retStatus = Nothing
        Exit Sub
     
    End Sub
     
     
    Private Sub Timer1_Timer()
    ReadData
    End Sub

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Par défaut
    pour moi c'est dans la DLL qu'un truc déconne.
    Le meilleur moyen de le vérifier c'est de commenter tout entre l'instanciation et le .exit que tu fais sur les objets : tu peux checker ta mémoire sans aucun appels de fonction ... Car tout ce qui se fait à l'intérieur ne relève pas de ton intervention (c'est le principe de l'api)

    Fait l'essai

    PS : mettre nothing en fin de fonction ne sert à rien car de toute façon vb détruit les objets locaux à la fin de l'exécution de cette dernière (end sub/property/fonction)

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Par défaut
    tu as commenté le .exit aussi ? Mais là c'est normal que ça déconne ..

    Si ce n'est pas le cas, de toute façon tu as la source de la fuite puisque la seule chose que tu fais dans la fonction c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set retStatus = EIDlibCtrl.Init("", -1, -1, lhandle)

  6. #6
    Membre émérite
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Par défaut
    Je n'ai évidement pas décommenté le .exit :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set retStatus = EIDlibCtrl.Init("", -1, -1, lhandle)
    Oui mais cette déclaration est nécessaire pour la suite des opérations...
    Je suppose dès lors que je ne puisse rien faire? Le problème se situerai dans la dll? c'est ça?

    Citation Envoyé par DarkVader Voir le message
    Par contre en explorant la librairie et en relisant ton code je n'ai pas vu de MapColID.Clear entre 2 appels -
    n'ayant que parcouru les méthodes fournies par la dll, est-ce normal ?
    Bien vu...
    Dans l'exemple du SDK, il n'utilisaient pas cette fonction donc je ne l'avais pas intégrée, cependant, je viens de l'y rajouter mais rien n'y fais...

    En gros, la charge mémoire de l'application augmente de 6ko a chaque appel à la fonction...

    Le pire c'est que comme Vld44 le dis c'est clairement à l'initialisation que ça foire, il ne lit encore aucune donné == aucune carte dans le lecteur...

  7. #7
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Citation Envoyé par Vesta Voir le message
    Bonjour,

    J'utilise actuellement un programme qui détecte l'insertion de carte d'identitée électronique dans un lecteur.
    Cependant j'ai remarqué qu'après un certain temps l'application gelait, en regardant d'un peu plus près ce problème, je me suis rendu compte que en fait elle prenait de plus en plus de mémoire.

    j'utilise la librairie suivante pour la lecture.
    EIDLIB

    Un timer relance a chaque fois la procédure de lecture.
    ...
    Citation Envoyé par Vesta Voir le message
    Quand je ferme la form de lecture, l'application revien a une utilisation de mémoire normale.
    La dernière mention peut laisser à penser que la fréquence de saisie est trop élevée par rapport à la vitesse de saisie de la carte à puce :
    empilement des demandes.

    N'y a-t-il pas dans les librairies fournies une fonction callback ou un évènement généré qui permette de n'intervenir qu'à bon escient ?

    Sinon que se passe-t-il en allongeant la fréquence du timer ? D'ailleurs à combien est fixée cette fréquence ?

  8. #8
    Membre émérite
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Par défaut
    Citation Envoyé par DarkVader Voir le message
    La dernière mention peut laisser à penser que la fréquence de saisie est trop élevée par rapport à la vitesse de saisie de la carte à puce :
    empilement des demandes.

    N'y a-t-il pas dans les librairies fournies une fonction callback ou un évènement généré qui permette de n'intervenir qu'à bon escient ?

    Sinon que se passe-t-il en allongeant la fréquence du timer ? D'ailleurs à combien est fixée cette fréquence ?
    Pas de fonction callback a ma connaissance, je n'ai rien vu de tel dans la doc.

    la fréquence est actuellement de 500ms je l'ai portée a 3000 et donc forcement la charge mémoire augmente moins vite mais elle augmente cependant toujours...

    mais le but est de lire rapidement la carte (dès qu'elle est insérée) et donc c'est une perte de temps.

    Citation Envoyé par Vld44 Voir le message
    pour moi c'est dans la DLL qu'un truc déconne.
    Le meilleur moyen de le vérifier c'est de commenter tout entre l'instanciation et le .exit que tu fais sur les objets : tu peux checker ta mémoire sans aucun appels de fonction ... Car tout ce qui se fait à l'intérieur ne relève pas de ton intervention (c'est le principe de l'api)

    Fait l'essai
    C'est ce que j'ai testé, même résultat.
    (J'ai commenté de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (retStatus.GetGeneral = 0) Then
    à

    Citation Envoyé par Vld44 Voir le message
    PS : mettre nothing en fin de fonction ne sert à rien car de toute façon vb détruit les objets locaux à la fin de l'exécution de cette dernière (end sub/property/fonction)
    Je savais que la portée des variables locales à la procédure se finissait avec elle mais j'ai pensé que cela était peu être nécessaire dans ce cas.
    Merci pour l'info

  9. #9
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Citation Envoyé par Vesta Voir le message
    Pas de fonction callback a ma connaissance, je n'ai rien vu de tel dans la doc.
    Normal c'est un activeX lol
    Mais pas d'évènement non plus de fourni
    Citation Envoyé par Vesta Voir le message
    la fréquence est actuellement de 500ms je l'ai portée a 3000 et donc forcement la charge mémoire augmente moins vite mais elle augmente cependant toujours...

    mais le but est de lire rapidement la carte (dès qu'elle est insérée) et donc c'est une perte de temps.
    J'attendais éventuellement une fréquence beaucoup plus élevée - 500 ms semble très correct.

    Par contre en explorant la librairie et en relisant ton code je n'ai pas vu de MapColID.Clear entre 2 appels -
    n'ayant que parcouru les méthodes fournies par la dll, est-ce normal ?

  10. #10
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Certaines fonctions ne sont même pas documentées dans leur pdf.
    Contacte-les directement, étant donné le peu de documentation, ce sera un gain de temps.

  11. #11
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Moi je propose d'initaliser la dll une bonne fois pour toute , au chargement de la form, donc de declarer la dll au niveau feuille.

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [VB6] Problème de fuite mémoire
    Par GyLes dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/03/2007, 14h58
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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