Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008
-
3 juil. 2008 à 22:23
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 2009
-
7 juil. 2008 à 17:50
Bonjour à tous,
Est il possible d'executer du code simultanément ? Je m'explique :
J'ai deux WebBrowser, et j'ouvre des pages différentes dans chacun d'entre eux, je vérif des objets etc ...
Dans mon code j'ai :
WebBrowser1.navigate
Instructions pour le premier
WebBrowser2.navigate
Instructions pour le second
Est-il possible de lire simultanément les deux parties pour gagner du temps ?
PS: Les deux parties sont totalement indépendantes.
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 4 juil. 2008 à 15:31
Moi non plus je ne comprend plus rien
Premier pb, quand on met:
Button1.PerformClick()
Button2.PerformClick()
Le logiciel attends la fin des instructions engendrées par le clic sur le bouton 1 avant d'émuer le clic sur le bouton 2.
Bien sur, c'est normal. Chaque ligne s'éxécute à la suite.
Est il possible de les lancer en simultané ?
Non.
Mais que fais-tu dans l'événement click de tes boutons? Tu n'est pas sensé y faire qqch qui prend du temps.
Pendant le fonctionnement du premier, je change de tab page et clique sur le bouton "Lancer" du second navigateur. C'est
alors que les problèmes commençent. Le second prosessus se lance
normalement, mais le premier se coupe et se fige jusqu'à la
finalisation du second processus !!!
C'est un problème de ton code à mon avis. Ca ne pose absolument aucun
problème de charger des pages dans plusieurs WebBrowser simultanément,
je pense donc que c'est quelque-chose dans ton code qui bloque ton
processus (un timer communs?).
La question principal, auquelle tu n'as pas répondu: quel est donc ce
fameux traitement que tu dois faire et qui prend tellement de temps? Je
ne comprend pas....
J'ouvre dans un web browser des pages web, je marque une pause de 10
seconde, navigue vers une autre page, attends encore et ainsi de suite
sur 5 pages.
Tout cela pour montrer à l'utilisateur le fonctionnement du site, comment remplir les champs...
Donc:
Dim WebURLs As New List(Of String) ' Liste des adresse à ouvrir
Dim Timer As New Timer ' Timer pour la tempo de 10 secs
Sub Form_Load()
' Ajout des URL à ouvrir
WebURLs.Add("Google.fr")
WebURLs.Add("VBFrance.com")
' Fixer l'interval d'attente à 10 sec
Timer.Interval = 10000
' Charger la 1ère URL
LoadNextURL
End Sub
Private Sub LoadNextURL
' Charger la prochaine URL dispo dans la liste
If WebURLs.Count > 0 Then
Browser.Navigate(WebURLs(0))
' Supprimer l'URL ouverte de la liste
WebURLs.RemoveAt(0)
Else
MsgBox("Terminé")
End If
End Sub
Private Sub Browser_DocumentLoaded
' Une fois la page chargé, on commence l'attente de 10 sec
Timer.Start
End Sub
Private Sub Timer_Tick
' Après l'attente, désactiver le timer et charger la prochaine URL
Timer.Stop
LoadNextURL
End Sub
Ce code fonctionne très bien (mais j'ai pas testé), sans attente, sans freeze, sans problème...
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 3 juil. 2008 à 22:34
salut,
en VB.net, techniquement, oui.
par contre n'en faisant pas, je ne saurai t'en dire beaucoup plus...
il faut attacher "ton évènement" (je suppose) à un thread séparé
voir system.je_sais_plus.thread()
c'est un sujet qui revient assez fréquemment, tu drevrais trouver tout au moins la bonne syntaxe sur le forum
++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 3 juil. 2008 à 23:05
Salut,
Si tes WebBrowsers sont visible, ce n'est pas possible. Car l'interface graphique doit être un seul et unique thread (impossible d'ajouter un control qui à été créer sur un autre thrad sur ta Form). En tout cas, je n'ai pas trouvé de façon pour le faire (g déjà cherché).
Mais techniquement, je ne vois pas l'utilité dans ton cas. Tes WebBrowser utilise déjà un thread séparé pour charger la page web, donc tu n'as rien a faire de plus.
Sub OpenPages
WebBrowser1.Navigate(...)
WebBrowser2.Navigate(...)
End Sub
Sub WebBrowser1.DocumentLoaded(.....)
....
End Sub
Sub WebBrowser2.DocumentLoaded(.....)
....
End Sub
Si une fois la page chargé, il y a un long traitement à faire, c'est là qu'il faut créer un thread séparé (par ex avec un BackgroundWorker)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 4 juil. 2008 à 11:46
Slt,
Je ne voit pas trop ce que tu veux dire par : "(impossible d'ajouter un control qui à été créer sur un autre thrad sur ta Form)" --> je ne souhaite pas ajouter un contrôle par code !?
Quand à l'événement, WebBrowser1.DocumentLoaded je ne peut pas l'utiliser car j'en utilise un similaire, mais qui lui surveille le téléchargement des données.
Je ne sais pas comment faire !
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 4 juil. 2008 à 13:30
"Je ne voit pas trop ce que tu veux dire par : "(impossible d'ajouter un control qui à été créer sur un autre thrad sur ta Form)""
C'est pour répondre à ta question "Est il possible d'executer du code simultanément ?"
Donc autrement dis, oui il est possible d'executer 2 thread de code séparément, mais pas pour contrôler des contrôles graphiques comme des WebBrowsers sur une même Form.
"Est-il possible de lire simultanément les deux parties pour gagner du temps ?" Lire quoi?
Et si tu nous expliquais ce que tu essaie de faire? Quel est ce traitement qui te prend tellement de temps?
Si c'est le temps de chargement de la page qui te pose problème, on reviens sur mon 1er message: Le chargement de la page dans un WebBrowser est déjà fait dans un thread séparé, donc les 2 pages se chargent en même temps en parallèle.
"Quand à l'événement, WebBrowser1.DocumentLoaded je ne peut pas
l'utiliser car j'en utilise un similaire, mais qui lui surveille le
téléchargement des données."
DocumentLoaded ou autres évènements te signalant la progression de
l'ouverture, le chargement de la page est quand même exécuté dans un
thread séparé.
J'ajoute que si tes pages web chargées ne doivent pas être affichées, mais que tu veux simplement avoir leur contenu, c'est mieux de télécharger la page sans utiliser un WebBrowser mais un WebClient par exemple. Ca te permet de télécharger ta page comme tout autre fichier, sans avoir besoins de la "lourdeur" d'un WebBrowser.
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 4 juil. 2008 à 13:42
Je ne comprends plus rien !!!
J'ai essayé de bidouiller un truc avec mon programme, je veux que l'utilisateur ait la possibilité de lancer les fonctionnalités de mon programme au démarrage de l'appli.
Pour cela, j'ai mis une checkbox par navigateur. Ces dernières commandent la valeur d'une variable consignée dans l'espace settings. Au lancement de l'appli, je vérifie les valeurs et si leur valeur est "True" je simule le clic sur les boutons servant à lancer normalement le processus.
Premier pb, quand on met:
Button1.PerformClick()
Button2.PerformClick()
Le logiciel attends la fin des instructions engendrées par le clic sur le bouton 1 avant d'émuer le clic sur le bouton 2.
Est il possible de les lancer en simultané ?
J'ai essayé de faire un autre test :
Chacun de mes deux webbrowser se trouve dans une tabpage pour plus de clareté.
Quand je clique sur le bouton "Lancer" du premier navigateur, tout le processus se lance normalement. Pendant le fonctionnement du premier, je change de tab page et clique sur le bouton "Lancer" du second navigateur.
C'est alors que les problèmes commençent. Le second prosessus se lance normalement, mais le premier se coupe et se fige jusqu'à la finalisation du second processus !!!
Peut on résoudre ce problème ?
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 4 juil. 2008 à 13:48
Désolé, j'ai tapé mon message en même temps que toi !
Donc pour les deux webbrowser ce n'est pas possible, il faut obligatoitement attendre la fin du premier avant de lancer le second.
Ce que j'essaie de faire :
J'ouvre dans un web browser des pages web, je marque une pause de 10 seconde, navigue vers une autre page, attends encore et ainsi de suite sur 5 pages.
Tout cela pour montrer à l'utilisateur le fonctionnement du site, comment remplir les champs...
(Pauses pour que l'utilisateur ait le temps de voir les informations et pour la synchronisation avec les messages qui apparaissent dans une RichtextBox (Commentaires).)
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 4 juil. 2008 à 17:41
En fait pour attendre j'utilise :
Friend Sub hbwait1(ByVal ms_to_wait As Long)
Dim endwait1 As Double
endwait1 = Environment.TickCount + ms_to_wait
While Environment.TickCount < endwait1
ToolStripStatusLabel5.Text = Math.Round((endwait1 - Environment.TickCount) / 1000)
System.Threading.Thread.Sleep(1)
Application.DoEvents()
End While
End Sub
Pour chacun des deux webbrowser j'utilise deux processus
Friend Sub hbwait1(ByVal ms_to_wait As Long)
Friend Sub hbwait2(ByVal ms_to_wait As Long)
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 4 juil. 2008 à 19:23
Oui je pense...
System.Threading.Thread.Sleep bloque ton thread, c'est à dire que plus rien d'autre ne s'exécute pendant le sleep. Tu fais un DoEvents dans ta boucle, ce qui permet de répondre au évènements, mais ne permet pas pour autant une exécution simultané de ton code.
Le 1er appel, ton attente débute...
Le 2ème appel, la deuxième attente débute. Mais le DoEvents ne permet pas à la 1ère attente de continuer, car il ne s'agit pas d'un évènements en attente qu'il faut exécuter.
Mais je ne suis pas sûr de ce que j'avance là, il faudrait faire un test pour confirmer...
En tout cas je te conseil d'utiliser un timer comme dans le code de mon post précédent. J'ai jamais aimé les boucles d'attente DoEvents
Pourquoi faire tout ça dans 2 WebBrowser en même temps? C'est pour regarder 2 démos en même temps? Si les tempo entre les chargements des pages sont les mêmes pour les 2 démos, tu peux utiliser 1 seul Timer qui te lance les navigations sur les 2 WebBrowsers.
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 4 juil. 2008 à 20:00
Je pense que ça vaut le coup d'utiliser ta méthode avec un timer.
Si j'ai bien compris:
je crée un timer avec un interval de 10 seconde.
Je charge ma page
Je vérif qu'elle est bien chargée
Si oui je lance le timer
on attends 10 seconde
Le timer s'arrète et je charge une nouvelle URL
et ainsi de suite
C'est cela ?
Juste une petite question: Pendant que le timer va décompter, VB va arreter la lecture du code jusqu'à l'écoulement total du temps ? Ou il va continuer à compiler ?
Ex:
Sub Form_Load()
Timer.Interval = 10000
Timer.start
MessageBox.show("OK")
End Sub
Private Sub Timer_Tick
Timer.Stop
End Sub
Je verrai le messageBox tout de suite ou dans 10 sec ?
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 4 juil. 2008 à 20:21
Tu le verra tout de suite
Le Timer compte dans un thread séparé. Une fois fini, il appel la fonction Timer_Tick
"C'est cela ?"
Oui "Vérifier que la page est bien chargé" veut dire simplement attendre l'évènement DocumentLoaded. Il survient lorsque le WebBrowser à terminé de charger le document (pas les images sauf erreur)
"Ou il va continuer à <strike>compiler</strike>s'exécuter ?"
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 5 juil. 2008 à 14:48
Pour essayer ta méthode, j'ai déjà mis en place une listview pour la liste des url (Ca m'arrange car en plus je peux les voir en cours d'execution). Cependant, j'ai encore un gros souci:
Por attendre le chargement complet d'une page je suis obligé d'utiliser:
Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
Threading.Thread.Sleep(1)
Application.DoEvents()
Loop
Sinon, ça ne marche pas !
Là encore j'ai Threading.Thread.Sleep(1) qui risque de me bloquer le prog si jamais les deux navigateurs attendent le chargement d'une page en même temps.
Il n'y a pas un meilleur moyen d'attendre ? tout en conservant :
WebBrowser1.ReadyState <> WebBrowserReadyState.Complete ???
Merci
Par contre si les deux navigateurs attendent en même temps et si on se base sur l'expérience précédente: Le premier à attendre verra son processus gelé jusqu'à la fin de l'attente du second et dès que le second aura fini d'attendre, il rerendra son cours non ? (Dans le cas ou l'attente des deux se fait en même temps)
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 6 juil. 2008 à 19:50
J'ai essayé ta méthode, ça marche bien avec la liste d'url, en ce qui concerne le chargement du navigateur, je vais essayer ta soluce, mais normalement ça devrait aller.
Si ça bug je te tiendrais au courant, mais il n'y a pas de raison.
Je te remercie pour ta patience et de ton aide...