Fuite de mémoire dans une fonction

Résolu
kargoles Messages postés 11 Date d'inscription jeudi 8 octobre 2009 Statut Membre Dernière intervention 30 octobre 2009 - 28 oct. 2009 à 10:26
kargoles Messages postés 11 Date d'inscription jeudi 8 octobre 2009 Statut Membre Dernière intervention 30 octobre 2009 - 28 oct. 2009 à 11:36
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

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 oct. 2009 à 11:05
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
1
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 oct. 2009 à 11:01
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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 oct. 2009 à 11:03
Pour le '= Nothing', cela ne peut s'appliquer qu'à des objets, pas sur des structures.
0
kargoles Messages postés 11 Date d'inscription jeudi 8 octobre 2009 Statut Membre Dernière intervention 30 octobre 2009
28 oct. 2009 à 11:09
Je teste ca tout de suite je vous tiens au courant rapidement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
28 oct. 2009 à 11:12
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
0
kargoles Messages postés 11 Date d'inscription jeudi 8 octobre 2009 Statut Membre Dernière intervention 30 octobre 2009
28 oct. 2009 à 11:17
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é
0
kargoles Messages postés 11 Date d'inscription jeudi 8 octobre 2009 Statut Membre Dernière intervention 30 octobre 2009
28 oct. 2009 à 11:26
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.
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
28 oct. 2009 à 11:34
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 !
0
kargoles Messages postés 11 Date d'inscription jeudi 8 octobre 2009 Statut Membre Dernière intervention 30 octobre 2009
28 oct. 2009 à 11:36
j'y retourne j'ai effectivement lu uniquement la partie pour VB6 croyant que seul cet article était interessant
0
Rejoignez-nous