kargoles
Messages postés11Date d'inscriptionjeudi 8 octobre 2009StatutMembreDernière intervention30 octobre 2009
-
28 oct. 2009 à 10:26
kargoles
Messages postés11Date d'inscriptionjeudi 8 octobre 2009StatutMembreDernière intervention30 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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
kargoles
Messages postés11Date d'inscriptionjeudi 8 octobre 2009StatutMembreDernière intervention30 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.
kargoles
Messages postés11Date d'inscriptionjeudi 8 octobre 2009StatutMembreDernière intervention30 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.
jmf0
Messages postés1566Date d'inscriptionmardi 26 décembre 2000StatutMembreDernière intervention 5 avril 20138 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 !