Execution simultanée de code VB

Résolu
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008 - 3 juil. 2008 à 22:23
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Derniè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.

15 réponses

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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...
3
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
5 juil. 2008 à 16:10
Pourquoi DocumentCompleted ne va pas?

Au pire tu fais un timer avec un interval de 100ms par ex, et tu fais le test dans son évènement Tick. Ca viendra au même :

Private Sub Timer_Tick
    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
        LoadNextURL
    End If
End Sub
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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  
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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)
0

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

Posez votre question
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 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 !
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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.
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 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 ?
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 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).)
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 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)

Ca peut venir de là ?
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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.
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 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 ?

Merci
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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 ?"
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 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)
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 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...
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
7 juil. 2008 à 17:50
Pas de quoi
0
Rejoignez-nous