Fuite de mémoire RAM quand j'utilise webbrowser VB

ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016 - 9 mars 2016 à 15:18
PWM63 Messages postés 127 Date d'inscription lundi 11 octobre 2004 Statut Membre Dernière intervention 18 mai 2016 - 18 mai 2016 à 17:33
Salut,
j'ai un prblme avec mon application, c'est juste une forme qui contient un navigateur webbrower pour charger des liens (groupes facebook) d'un fichier .txt, apres certain temps je trouve que l'application a consommée toute la RAM !!!
SVP, aidez moi, s'il ya une solution pour libérer la mémoire consommée par le webbrowser apres chaque navigation ???

voici le code:

Dim liens As String() = File.ReadAllLines("D:\liste_grps.txt")

For i = 1 To nbr_liens

WebBrowser1.Navigate(liens(i))

WebBrowser1.Stop()

Next


merci d'avance

10 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 mars 2016 à 16:12
Bonjour,
Et que se passerait-il selon toi si tu ouvrais le même nombre de liens URL manuellement ?
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
9 mars 2016 à 16:20
merci ucfoutu pour ta réponse,
il donne le meme problme ! je pense q l ya probleme au niveau de webbrowser, qui fait le cumule de la mémoire consommée.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 mars 2016 à 16:25
Et ce n'est alors pas un problème VB.Net, mais totalement autre ...
Tu aurais le même en ouvrant par exemple un grand nombre de n'importe quoi d'autres choses.
Sans compter que le navigateur garde en plus l'historique des liens !
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
9 mars 2016 à 16:29
j'ai essayer avec la methode dispose(), mais elle tue le webbrowser definitivement, alors que j'ai besoin d'utiliser le navigateur avec le reste des liens !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 9/03/2016 à 16:32
Une autre fois, donc : ce n'est pas un problème VB.Net, mais un problème de limites d'une machine.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
9 mars 2016 à 16:44
le webbrowser est un element de vb.net, alors, la question c'est, coment on peut libérer la mémoire vive consommée par cet element apres plusieur utilisation sans ferme l'application ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 mars 2016 à 17:25
Voilà ce que j'essaierais :
1) Ne connaissant pas VB.Net, je ne sais pas quelle est la valeur par défaut du second paramètre de la méthode navigate du contrôle Webbrowser
Dans le doute, je la préciserais personnellement à False (True voulant dire dans une nouvelle fenêtre) ===>>>
WebBrowser1.Navigate(liens(i), False)
2) je viderais par ailleurs le cache entre chaque navigation.

Et si tout cela ne suffisait pas, je "zigouilleerais" (Dispose) le WebBrowser, puis le recréerais.
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
9 mars 2016 à 17:31
merci ucfoutu,
c'est exectement ce que je cherche, si tu peux me dire comment je peux intégrer cette algorithme pour essayer, je suis debutant en vb,
merci bcp
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
9 mars 2016 à 17:39
Ben ...
1) Pour le point 1), il me semble que je t'en ai proposé la syntaxe, non ?
2) pour le point 2) : je ne connais pas VB.Net (te l'ai dit plus haut), mais essaierais, entre chaque navigation, de lancer cette ligne de commande, qui devrait vider le cache ...:
"rundll32.exe","InetCpl.cpl,ClearMyTracksByProcess 8"
Je crois savoir que sous VB.Net tu peux utiliser Processstart pour la lancer.
Ce qui devrait alors peut-être (à vérifier) s'écrire à peu près ainsi :
System.Diagnostics.Process.Start("rundll32.exe","InetCpl.cpl,ClearMyTracksByProcess 8")
NB : toi, tu es un débutant en VB.Net . Il se trouve que je ne suis même pas débutant dans ton langage, moi ... Etonnant, non ?
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
9 mars 2016 à 17:06
Bonsoir ajdad.
Est-ce bien la totalité de votre code que vous nous avez donné ?
Cordialement.
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
Modifié par ajdad le 9/03/2016 à 17:26
merci Zermelo pour votre reponse,
oui,
j'ai une simple application, qui me permet de charger une liste de liens (groupes facebook) un par un:

Dim liens As String() = File.ReadAllLines("D:\liste_grps.txt")

For i = 1 To nbr_liens

WebBrowser1.Navigate(liens(i))

WebBrowser1.Stop()

Next

mais apres qlq temps, j'ai recu un message que la mémoire est insuffisante !!!

j'ai verifié les performances de mon pc par le gestionnaire de taches, et j'ai trouvé que cet application atteinte 1.5Go !!! presqu toute la ram !
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
9 mars 2016 à 17:27
Mais alors comment faites-vous pour que nbr_liens soit le nombre de strings de la liste ?
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
9 mars 2016 à 17:33
oui oui zermelo, dans mon code je précise que nbr_liens = 500,
on peut ecrire :

for i = 1 to 500

parceque j'ai 500 liens
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14 > ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
9 mars 2016 à 18:01
La totalité de votre code est le texte de ce code, et seulement cela. Autre chose. En vb.net la boucle For Next commence obligatoirement par 0, et non par 1 comme en vb6.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017
9 mars 2016 à 18:05
Bonjour, Zermelo,
En VB6 également, puisque sa "liste" serait un array obtenu par un Split (éclatement du texte de son fichier, pratiqué sur les vbcrlf)
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14 > ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018
9 mars 2016 à 18:22
Bonsoir ucfoutu, et merci pour ta correction humoristique.
Je crois que notre ami n'est pas en Vb.net, ou qu'il est loin de le maîtriser.
A+
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
10 mars 2016 à 17:55
c'est un vrai problème n'est ce pas ;-)
ou est les vrai programmeurs !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 10/03/2016 à 18:01
Pardon ?
C'est une plaisanterie ? (et en mauvais français ..)
Où est le code que tu as au moins tenté, toi, le "vrai", sur la base de ce que je t'ai indiqué ?

EDIT : si tu n'es venu ici que pour copier/coller et que tu fais de surcroît ce genre de réflexion, tu vas te trouver bien seul, sois-en certain !
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
10 mars 2016 à 18:02
ucfoutu, vraimnt j'ai besoin de l'aide, j'ai essayé avec plusieurs solutions mais aucun resultat !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
10 mars 2016 à 18:10
Relis-moi et fais au moins cet effort d'intégration de ce dont je t'ai parlé.
Si tu ne fais pas cet effort (en essayant en plus de piquer au vif pour "récolter"), je te laisse pile où tu es.
Nous ne sommes pas ici dans une cour scolaire de récréation et certaines attitudes, la tienne en particulier, y sont inconcevables.
Voilà.
0
ajdad Messages postés 13 Date d'inscription mercredi 9 mars 2016 Statut Membre Dernière intervention 10 mars 2016
10 mars 2016 à 18:26
monsieur ucfoutu, excuse moi, j'ai appliqué ta solution mais aucun resultat.
alors, hors ma manière d'exprimer (en mauvais français comme tu as dis), j'ai pas reçu aucune solution à ce problème de la part de vos experts !

mon message en haut est clair (vous pouvez faire un petit programme, juste une forme avec webbrowser , importez une liste de liens , charger ces liens un par un espacées par intervalle de temps, puis faire CTRL+ALT+SUPPR , et voir la croissance de la ram consommée par cette petite application, c ça le prblme!)

j'ai fait plusieurs recherches sur des forums anglais personne a donnée une solution a ce prblme.

encore une fois je vous remercie pour vos efforts,
A+
0
PWM63 Messages postés 127 Date d'inscription lundi 11 octobre 2004 Statut Membre Dernière intervention 18 mai 2016
18 mai 2016 à 17:33
Bonjour,

Je viens de trouver 1 solution pour résoudre ce problème de fuite mémoire.

D'après mes tests, cela fonctionne (sur VB Net 2010). La mémoire libérable est automatiquement réellement libérée par le système dès que cette mémoire libérable est suffisamment conséquente. Avant ma solution, mon programme montait à plus d'1 Go en RAM avant que le message d'erreur ne s'affiche. Maintenant, dès que le programme monte vers les 400 Mo, cela redescend à 100 Mo.

Pour rendre la mémoire du WebBrowser libérable, il faut normalement faire 1 Dispose. Le problème est que le contrôle n'est plus utilisable.

Il est donc possible de contourner ce problème, en créant 1 liste de WebBrowser.
Une fois la page chargée, il ne reste plus qu'à faire 1 Dispose du WebBrower dans cette liste, et le tour est joué.
On fait ensuite 1 Remove sur la liste pour ne pas garder 1 élément vide pour rien.

En espérant que ça en aide plus d'un. :)

PS : dans mon exemple ci-dessous, mon WB n'avait pas à s'afficher à l'écran, les contôles sont donc créés dans le code uniquement. Si vous avez besoin d'afficher le WebBrowser à l'écran, je pense qu'il suffit juste d'ajouter le contrôle dans le conteneur (form ou autre).

Exemple :
Public Class Form_WB

    Dim wb As WebBrowser 'le WB qui sera instancié quand on en aura besoin, et qui ne sera jamais Disposed parce qu'on veut le réutiliser
    Dim wbs As New List(Of WebBrowser) 'le WB ci-dessus sera ensuite ajouté dans cette liste de WB ; on naviguera dans le wb de cette liste, et on fera le dispose du wb dans cette liste

    Private Sub Button_Naviguer_Click(sender As System.Object, e As System.EventArgs) Handles Button_Naviguer.Click

'on recrée le WB
        wb = New WebBrowser

        wb.ScriptErrorsSuppressed = True

        AddHandler wb.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf wb_DocumentCompleted)

'on l'ajoute dans la liste
        wbs.Add(wb)

'pour naviguer, ne pas utiliser wb, mais utiliser wbs(n-1)
            wbs(wbs.Count - 1).Navigate(mon_url, False) 'ne pas oublier de déclarer / renseigner mon_url

    End Sub

    Private Sub wb_DocumentCompleted(sender As System.Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs)

'mettre du code ici si besoin

'terminer par ceci :

        wbs(wbs.Count - 1).Dispose() 'on libère le wb de la liste ; le wb hors liste est donc toujours disponible

'à ce stade, si on fait 1 GC.Collect, la mémoire devrait être immédiatement libérée (je n'ai pas essayé car le système s'en charge tout seul quand il a besoin de RAM)

        wbs.RemoveAt(wbs.Count - 1) 'l'item vide ne sert à rien dans la liste, autant réduire la liste

    End Sub

End Class

0
Rejoignez-nous