Execution simultanée de code VB [Résolu]

Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Dernière intervention
27 octobre 2008
- 3 juil. 2008 à 22:23 - Dernière réponse :
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
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.
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 4 juil. 2008 à 15:31
3
Merci
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...

Merci Kevin.Ory 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Kevin.Ory
Meilleure réponse
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 5 juil. 2008 à 16:10
3
Merci
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

Merci Kevin.Ory 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Kevin.Ory
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
- 3 juil. 2008 à 22:34
0
Merci
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  
Commenter la réponse de PCPT
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 3 juil. 2008 à 23:05
0
Merci
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)
Commenter la réponse de Kevin.Ory
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Dernière intervention
27 octobre 2008
- 4 juil. 2008 à 11:46
0
Merci
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 !
Commenter la réponse de Marneus73
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 4 juil. 2008 à 13:30
0
Merci
"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.
Commenter la réponse de Kevin.Ory
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Dernière intervention
27 octobre 2008
- 4 juil. 2008 à 13:42
0
Merci
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 ?
Commenter la réponse de Marneus73
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Dernière intervention
27 octobre 2008
- 4 juil. 2008 à 13:48
0
Merci
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).)
Commenter la réponse de Marneus73
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Dernière intervention
27 octobre 2008
- 4 juil. 2008 à 17:41
0
Merci
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à ?
Commenter la réponse de Marneus73
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 4 juil. 2008 à 19:23
0
Merci
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.
Commenter la réponse de Kevin.Ory
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Dernière intervention
27 octobre 2008
- 4 juil. 2008 à 20:00
0
Merci
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
Commenter la réponse de Marneus73
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 4 juil. 2008 à 20:21
0
Merci
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 ?"
Commenter la réponse de Kevin.Ory
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Dernière intervention
27 octobre 2008
- 5 juil. 2008 à 14:48
0
Merci
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)
Commenter la réponse de Marneus73
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Dernière intervention
27 octobre 2008
- 6 juil. 2008 à 19:50
0
Merci
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...
Commenter la réponse de Marneus73
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 7 juil. 2008 à 17:50
0
Merci
Pas de quoi
Commenter la réponse de Kevin.Ory

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.