Perte de mémoire (Memory leak) pour le MSCOMM et WebBrowser
Alex009
Messages postés25Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention10 février 2007
-
9 févr. 2007 à 17:14
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
10 févr. 2007 à 14:46
Bonjour
Désolé du dérangement.
Tout d'abord je développe en C# avec le Framework 1.1
J'ai des pertes de mémoires(Memory leak) lorsque j'utilise le MSCOMM(activex de VB6) pour ma communication port serie(imprimante, lecteur de carte magnetique bancaire: AxMSCommLib.AxMSComm
) et aussi avec le axWebBrowser1 (AxSHDocVw.AxWebBrowser ) pour l'affichage des données dans un ecran WinForm.
Voyons cela :
la mémoire allouées n'est pas récupérée après : axWebBrowser1.Dispose() ainsi que CommPinpad.Dispose()
private SerialIO.cPinpad MyCommPinpad =
null; // il se chargera de faire le traitement de mon port serie
private AxMSCommLib.AxMSComm CommPinpad; // l'object COM de ma form
if (MyCommPinpad!=
null)
{ MyCommPinpad.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(MyCommPinpad
) //
cette section lève une exception au niveau du cast, je ne comprends pas pkoi. Je veux en faites libérer la mémoire alloué après le new SerialIO.cPinpad(CommPinpad);
MyCommPinpad = null;
CommPinpad.Dispose(); // memoire non restituer a ce niveau
CommPinpad = null;
axWebBrowser1.Dispose(); // memoire non restituer a ce niveau non plus
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 10 févr. 2007 à 06:54
Salut, à prioris pour forcer la libération d'un objet COM en plus des ses propres méthodes de libération de ressources genre Close et Dispose je t'aurais dit d'appeller ReleaseComObject jusqu'a que la fonction renvoie 0, normalement une seule fois suffit si une seule référence est contenue par le wrapper managé. Malgré ça la libération de la mémoire n'est pas immédiate, il faut au moins 2 appels à GC.Collect pour liberer effectivement l'objet COM mais tu peux t'en passer et laisser faire le GC et ne pas oublier de mettre à nul tous les wrappers managés pour qu'ils soient collectés.
j'ai pas MSCOMM sous la main pour tester.. mais donc si c'est un ActiveX tu dois avoir une InvalideCastException, c'est ça !? l'appelle à Close ou Dispose + GC.Collect devrait suffir..
Pour le WebBrowser c'est la même chose sauf que j'avais lu qu'il y'a un bug, il faut naviguer vers une page vide avant de le fermer ou quelque chose comme ça.
Alex009
Messages postés25Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention10 février 2007 10 févr. 2007 à 14:40
Salut Lutinore
Merci pour ta reponse, je n'avais pas utilisé la notion de GC.Collect car il semble que ça ralentit la performance de l'application à chaque appel. Mais si c'est le dernier recours je serai obligé de l utiliser. Concernant le WebBrowser, effectivement d'apèrs qu il ya un un bug au niveau du DOM. Je continuerai a investiguer la dessus.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 10 févr. 2007 à 14:46
Salut,
Surtout que si GC.Collect permet effectivement la libération, c'est que le GC peut prendre en charge cette libération, donc autant le laisser décider du bon moment au lieu de tenter de le forcer à libérer plus vite.
Tant qu'il y a suffisamment de mémoire libre, pas la peine de perdre du temps à la libérer.