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)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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)
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)
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)
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
Pascal H <pascal@alussinan.org> 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 ?
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 ?