Attente paradoxale !

Signaler
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Statut
Membre
Dernière intervention
27 octobre 2008
-
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
-
Bonjour à tous,
Encore un pb, de toute façon, je n'ai que ça !!!
Je voudrais qu'un webbrowser affiche une page web et attende 10 secondes avant d'en ouvrir une autre.
Pour attendre j'utilise : System.Threading.Thread.Sleep(10000)
Le problème est que le webbrowser n'a pas le temps de naviguer avant que le programme ne réponde plus de rien pendant 10 sec !!! A la fin du temps, il charge la dernière page, sans me charger celle ou il faut attendre !!!
Je ne vais tout de même pas créer un temps d'attente pour encore attendre.

7 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
Le problème de Sleep, c'est qu'il n'attend pas, il suspend l'execution du thread en cours donc forcément ce que tu devais faire à coté est aussi suspendu.

Soit tu te fais ta propre boucle d'attente,
soit tu crée un nouveau thread pour executer ce qui doit etre fait durant la suspension de ce thread.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
6
Date d'inscription
lundi 3 janvier 2005
Statut
Membre
Dernière intervention
22 juin 2008

moi j'avais le meme soucis et j'ai trouver cette source cela te permet d'attendre en faisant autre chose
tu insere cette fonction dans ton programme et pour attendre tu l'utilise par un simple
xWait(10000)  'le programme va rester a cette ligne pendant 10 secondes

Private Declare Function GetTickCount Lib "kernel32" () As Long

'********************************************************************************************
' Name       : xWait
' Purpose    : Wait for the time requested without
'              stopping the execution of other functions
' Syntax     : xWait(MilsecToWait)
' Parameters : MilsecToWait : Time to wait in millisecond
' Return     : /
'********************************************************************************************
Public Sub xWait(ByVal MilsecToWait As Long)
    Dim lngEndingTime As Long
 
    lngEndingTime = GetTickCount() + (MilsecToWait)
    Do While GetTickCount() < lngEndingTime
        DoEvents
    Loop
End Sub

'PS je ne suis pas l'inventeur de cette superbe fonction
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
7
Salut,
Et avec un simple timer ca ne va pas?

Private WithEvents timer As New Timer
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    timer.Interval = 10000 ' 10 sec
    timer.Start()
End Sub

Private Sub timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles timer.Tick
    ' Ce code s'éxécute 10 secondes après le chargement de la page
End Sub
Messages postés
344
Date d'inscription
mercredi 24 janvier 2007
Statut
Membre
Dernière intervention
27 octobre 2008

[auteur/SERIALNEO/415612.aspx serialneo:]
Ta fonction est une boucle, et ça n'accapare pas toute la mémoire du processeur ?
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
7
Un processeur n'a pas de mémoire, du moins pas dans le sens dans lequel tu l'entend. Et non ça ne prend pas toutes les resources du processeur, car il y a un DoEvents, ce qui permet au processeur de gérer les autres événements du processus.

Mais pouquoi réinventer la roue? Je ne comprend pas pourquoi tu veux absolument réinventer un Timer alors que la classe Timer existe déjà. C'est bien beau de faire du multi-threading, des sleeps, des boucles et des appels aux API, mais un Timer.Start est franchement plus simple.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
Attention toutefois à ne pas confondre Timer et attente.

Un timer sert (à la base) à executer une série d'instruction périodiquement toutes les x secondes.

L'attente est par contre une pause faite dans l'execution du programme. Ce n'est pas la même chose que le timer.

La fonction Sleep est une façon de répondre à ce besoin d'attente en suspendant le thread en cours. Ce qui peut etre génant quand une autre partie du code de ce thread à besoin de continuer à tourner.
La boucle permet de faire une attente dans le code sans suspendre le thread, les évènements, par exemple continueront à etre traiter.
L'autre solution en utilisant la Fonction Sleep est effectivement d'executer le code qui a besoin de continuer à tourner dans un autre thread.

Ceci dit Marneus, tu nous parle d'attente, mais ton code semble etre répétitif, donc peut-etre qu'un timer serait plus approprié. A toi de voir.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
7
Oui je suis bien conscient de la différence. Mais Marneus veut "qu'un webbrowser affiche une page web et attende 10 secondes avant d'en ouvrir une autre", donc effectivement je crois qu'un Timer est absolument adéquat:

Sub Form_Load(...)
    WebBrowser1.Navigate("www.vbfrance.com")
    Timer.Start
End Sub

Sub Timer_Tick(...)
    WebBrowser1.Navigate("www.google.com")
End Sub

Il n'y a pas plus simple....
(Toutefois ce code est moins optimal que mon précédent car on n'attend pas que la 1ere page soit chargé avant de faire l'attente de 10 sec)

-----------------------------------------------------------------------------

Mais si vraiment tu veux faire sans Timer Marneus, je te propose presque le même exemple que serialneo mais en plus simple (sans API) :

Private Sub Form1_Load(...) Handles MyBase.Load
    WebBrowser1.Navigate("www.vbfrance.com")
    Dim EndTime As Date = Now.AddSeconds(10)
    Do Until Now > EndTime : Application.DoEvents() : Loop
    WebBrowser1.Navigate("www.google.com")
End Sub