Fuite de mémoire dans une fonction [Résolu]

Signaler
Messages postés
11
Date d'inscription
jeudi 8 octobre 2009
Statut
Membre
Dernière intervention
30 octobre 2009
-
Messages postés
11
Date d'inscription
jeudi 8 octobre 2009
Statut
Membre
Dernière intervention
30 octobre 2009
-
Bonjour a tous.

J'ai récupéré la programmation d'un truc déjà existant toutefois j'ai une fuite mémoire qui fait grossir la taille du fichier d'échange.

L'action principale lance un processus et attend que celui ci se termine

Ret_Prgm = Shell("cmd")
Do
    DoEvents
    Sleep 50
Loop While ProcessusActif(Ret_Prgm)


quand je suis en loop while true la taille n'augmente pas donc j'en déduis que c'est dans la fonction ProcessusActif.

Je vous joins le code de ce module :

Option Explicit

'constantes processus
Public Const MAX_PATH = 260
Public Const TH32CS_SNAPPROCESS = 2&

'type processus
Public Type PROCESSENTRY32
    lSize           As Long
    lUsage           As Long
    lProcessID       As Long
    lDefaultHeapId   As Long
    lModuleId       As Long
    lThreads         As Long
    lParentProcessId As Long
    lPriClassBase   As Long
    lFlags           As Long
    sExeFile         As String * MAX_PATH
End Type

'API processus & threads
Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)



Public Function ProcessusActif(PID As Long) As Boolean

Dim Cpt As Integer
Dim strNomExe As String
Dim strProcessID As String
Dim lngSnapShot As Long
Dim r As Long
Dim uProcess As PROCESSENTRY32

lngSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
If lngSnapShot <> 0 Then
    uProcess.lSize = Len(uProcess)
    r = ProcessFirst(lngSnapShot, uProcess)
        Do While r
            If uProcess.lProcessID = PID Then
                ProcessusActif = True
                'Set uProcess = Nothing
                Exit Function
            End If
            r = ProcessNext(lngSnapShot, uProcess)
         Loop
    CloseHandle (lngSnapShot)
End If
ProcessusActif = False
'Set uProcess = Nothing
End Function


Comme on peut le voir j'ai essayé de détruire l'objet uProcess pour libérer de la mémoire mais quand je fait un set uProcess = Nothing il me dit qu'un objet est requis.

La taille du fichier d'échange augmente de 1 - 2 Mo assez régulièrement et n'est libéré que quand je ferme l'appli (en stand alone) ou quand je ferme l'ide quand je le lance directement de la.

Quelqu'un aurai une idée pour éviter cette augmentation de mémoire? ou même pourquoi le set toto = Nothing ne fonctionne pas? (j'ai le même problème ailleurs dans mon code mais je répercuterai cela en fonction des réponses)

Merci d'avance.

9 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Ah bah si, je suis con : Ta boucle tourne tant que le PID est présent --> Comme tu sors sans faire le CloseHandle, ça s'accumule.
Remplacer la ligne '= Nothing' par un CloseHandle
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
Rien ne saute aux yeux.
La seule 'anomalie' est la sortie avec Exit Function sans avoir refermé avec CloseHandle, mais il ne devrait apparaitre qu'une fois et pas générer une accumulation de mémoire.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Pour le '= Nothing', cela ne peut s'appliquer qu'à des objets, pas sur des structures.
Messages postés
11
Date d'inscription
jeudi 8 octobre 2009
Statut
Membre
Dernière intervention
30 octobre 2009

Je teste ca tout de suite je vous tiens au courant rapidement
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Bonjour,

Il sera intéressant de savoir quels OS et machine sont utilisés...

Je te conseille par ailleurs de lire ceci :
http://nativemobile.blogspot.com/2006_01_01_nativemobile_archive.html
Messages postés
11
Date d'inscription
jeudi 8 octobre 2009
Statut
Membre
Dernière intervention
30 octobre 2009

os windows XP pro service pack 3
Ordi Intel cor 2 Due 2gHz 2 Go Ram (Dell)

J'ai rajouté un closeHandle avant le exit fonction et ça a l'air stabilisé sur cette partie je vais donc lire le lien et me renseigner un peu plus sur ce qu'est CloseHandle étant assez novice en la matière.

Merci a vous deux pour votre réactivité
Messages postés
11
Date d'inscription
jeudi 8 octobre 2009
Statut
Membre
Dernière intervention
30 octobre 2009

jmfo ton lien ne notifie juste que VB6 est très vieux et pas facilement maintenable.
J'en conviens bien étant principalement développeur java à la base mais je ne choisit pas ce que l'employeur me donne et je me vois encore moins lui dire qu'il faut qu'il prévois une refonte de l'application dans un nouveau langage qui risque d'être couteux pour lui.
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Tu n'as manifestement pas lu jusqu'au bout ...
On t'y parle entre autres d'une constante...(TH32CS_SNAPNOHEAPS avec, pour valeur : 0x40000000)
Relis tout !
Messages postés
11
Date d'inscription
jeudi 8 octobre 2009
Statut
Membre
Dernière intervention
30 octobre 2009

j'y retourne j'ai effectivement lu uniquement la partie pour VB6 croyant que seul cet article était interessant