Perte de mémoire (Memory leak) pour le MSCOMM et WebBrowser

Alex009 Messages postés 25 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 10 février 2007 - 9 févr. 2007 à 17:14
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Derniè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

MyCommPinpad =
new SerialIO.cPinpad(CommPinpad);



private






void
MyCommPinpad_ReturnDataEvent(

object
sender, SerialIO.GenerateEventArgs e)
{string
  myData = e.Data.ToString();
    }

private

void btnQuit_Click(
object sender, System.
EventArgs e){

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  

    }

public

void Afficher(string html)

{
object empty = System.Reflection.
Missing.Value;

this.axWebBrowser1.Silent =
true;
axWebBrowser1.Navigate(
"about:blank",
ref empty,
ref empty,
ref empty,
ref empty);

mshtml.IHTMLDocument2 doc = axWebBrowser1.Document
as mshtml.IHTMLDocument2;

// write to the doc
doc.clear();
doc.writeln(html);

}
}

Après ce bref brossage de mon problème, qq1 à une idée de comment recupérer la mémoire à l'allocation d'un MSCOMM et du WebBrowser.

Je vous remercie.

3 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
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.
0
Alex009 Messages postés 25 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 10 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.

Au plaisir.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
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.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous