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

Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- 9 mars 2016 à 15:18 - Dernière réponse :
Messages postés
127
Date d'inscription
lundi 11 octobre 2004
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
Afficher la suite 

Votre réponse

25 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 9 mars 2016 à 16:12
0
Merci
Bonjour,
Et que se passerait-il selon toi si tu ouvrais le même nombre de liens URL manuellement ?
Commenter la réponse de ucfoutu
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- 9 mars 2016 à 16:20
0
Merci
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.
Commenter la réponse de ajdad
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 9 mars 2016 à 16:25
0
Merci
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 !
Commenter la réponse de ucfoutu
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- 9 mars 2016 à 16:29
0
Merci
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 !
Commenter la réponse de ajdad
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- Modifié par ucfoutu le 9/03/2016 à 16:32
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- 9 mars 2016 à 16:44
0
Merci
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 ?
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 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.
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
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
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
>
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
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 ?
Commenter la réponse de ajdad
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Dernière intervention
13 août 2017
- 9 mars 2016 à 17:06
0
Merci
Bonsoir ajdad.
Est-ce bien la totalité de votre code que vous nous avez donné ?
Cordialement.
Commenter la réponse de Zermelo
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- Modifié par ajdad le 9/03/2016 à 17:26
0
Merci
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 !
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
>
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
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)
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Dernière intervention
13 août 2017
>
Messages postés
18039
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+
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- 9 mars 2016 à 19:48
merci mes amis pour votre soutien,
Zermelo, je programme en VB.net la dernière version ;-) et mon programme marche bien du coté programmation, le seul prblm c de la fuite de RAM à cause de webbrowser. j'ai vous donné juste une idée sur le code sans entree dans le detail des syntaxe.
et je sais bien mon probleme mais j'ai pas une solution :-)
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- 9 mars 2016 à 19:51
alors s il ya un compétent en VB, et qui peut resoudre ce probleme (fuite de RAM à cause de webbrowser) alors c ce que je cherche exactement
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- 9 mars 2016 à 19:56
vous pouvez faire un petit programme, juste une forme avec webbrowser , importez une liste de liens , charger ces liens un par un, avec une intervalle de temps, clic CTRL+ALT+SUPPR , et voir la croissance de la ram consommée par cette petite application ,

En bref c ça le PROBLEME pas autre chose !!!
Commenter la réponse de ajdad
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
Dernière intervention
10 mars 2016
- 10 mars 2016 à 17:55
0
Merci
c'est un vrai problème n'est ce pas ;-)
ou est les vrai programmeurs !
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 10 mars 2016 à 17:58
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 !
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
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 !
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
>
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
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à.
Messages postés
13
Date d'inscription
mercredi 9 mars 2016
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+
Commenter la réponse de ajdad
Messages postés
127
Date d'inscription
lundi 11 octobre 2004
Dernière intervention
18 mai 2016
- 18 mai 2016 à 17:33
0
Merci
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

Commenter la réponse de PWM63

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.