OVH Cloud OVH Cloud

[WD7.5][205n] la mémoire non libérée, encore...

2 réponses
Avatar
Romain PETIT
Bonjour,

je crois avoir déterminé une des sources possible de mon problème de
consommation de mémoire abusive sur une de mes appli.
(http://minilien.com/?t8d7QxqF0M)


Vous trouverez ici un petit projet à télécharger (Excel nécessaire pour
tester) :
http://rompetit.free.fr/Pub/WD7/TestOLE.zip
qui contient principalement le bout de code ci-dessous.

Je constate qu'à chaque boucle, 4 ko de mémoire ne sont pas libérés.
Au final, si mon appli tourne 24h/24 (en fait j'appelle une DLL en OLE, mais
ici l'exemple d'Excel est identique), mon appli se retrouve au bout de
quelques jours avec 30 à 50 Mo de mémoire utilisée !!
J'ai essayé de lancer cette procédure par thread (avec attente de la fin)
mais la mémoire n'est pas plus libérée.

**********Boucle principale
BOUCLE
SI gf_bFin ALORS SORTIR
sCpt++
Multitache(-100)

SI PAS fl_SauveFichierExcelEnTexte(sRepTravail+"testC13.wk1",
sRepTravail+"test.txt") ALORS
sCptErr++
FIN
// Avec Thread : remplacer les 3 lignes précédentes par ce qui suit
//ThreadExécute("thread",threadNormal,
"fl_SauveFichierExcelEnTexte",sRepTravail+"testC13.wk1",
sRepTravail+"test.txt")
//ThreadAttend("thread")

Multitache(-100)
FIN

**********fl_SauveFichierExcelEnTexte
FONCTION fl_SauveFichierExcelEnTexte(sFichier, sFichierTexte)
bRes est un booléen
QUAND EXCEPTION
RENVOYER Faux
FIN
sFichierTexte = fExtraitChemin(sFichier,
fDisque+fRépertoire+fFichier)+".txt"
xltext est un entier = -4158
MaFeuilleXLS est un objet automation dynamique
MaFeuilleXLS = allouer un objet automation "Excel.Application"

MaFeuilleXLS>>Workbooks>>Open(sFichier)
//on supprime s'il existe déjà
SI fRep(sFichierTexte, frFichier)<>"" ALORS fSupprime(sFichierTexte)

MaFeuilleXLS>>ActiveWorkbook>>SaveAs(sFichierTexte, xltext, OLEFaux)
MaFeuilleXLS>>DisplayAlerts = OLEFaux
MaFeuilleXLS>>Quit()
libérer MaFeuilleXLS

bRes= Vrai
RENVOYER bRes


--
Romain PETIT
(mailto:rompetit_chez_ifrance.com)

2 réponses

Avatar
Romain PETIT
Romain PETIT a écrit :

MaFeuilleXLS est un objet automation dynamique
MaFeuilleXLS = allouer un objet automation "Excel.Application"


[...]
libérer MaFeuilleXLS



J'ai eu un doute, mais c'est la même chose de cette façon :

MaFeuilleXLS = ObjetActif("Excel.Application")
SI MaFeuilleXLS = Null ALORS
// On lance Excel
MaFeuilleXLS = allouer un objet automation "Excel.Application"
FIN
[...]
libérer MaFeuilleXLS

A+

--
Romain PETIT
(mailto:rompetit_chez_ifrance.com)
Avatar
Romain Petit
Pascal H a écrit:

Désolé, pas le temps de tester cette semaine car je suis en formation.
Par contre je voulais savoir si le problème était identique avec la
version 5.5 de Windev.



Pas trop de temps non plus pour tester...

J'essayerai de faire des tests de ton code le week end prochain.
N'est-il pas envisageable que cette perte de ressources puisse venir de
l'objet automation lui-même et non de Windev ?



Oui, c'est possible aussi.
Je viens de faire un petit essai avec VB :

La procédure ci-dessous consomme de la mémoire et ne la libère pas.
Un handle également n'est pas libéré.

*** VB6
Dim oXLS As Object
Set oXLS = CreateObject("Excel.Application")
oXLS.quit
Set oXLS = Nothing
***

Je sêche, pas trouvé de référence précise sur cette perte de ressource,
comment s'en sortir à part fermer l'appli et la relancer ?

A+

--
Romain Petit