Attente paradoxale !

Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008 - 21 juin 2008 à 10:51
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 21 juin 2008 à 22:32
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

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 juin 2008 à 11:14
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 #   
0
serialneo Messages postés 6 Date d'inscription lundi 3 janvier 2005 Statut Membre Dernière intervention 22 juin 2008
21 juin 2008 à 11:27
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
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
21 juin 2008 à 16:01
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
0
Marneus73 Messages postés 344 Date d'inscription mercredi 24 janvier 2007 Statut Membre Dernière intervention 27 octobre 2008
21 juin 2008 à 18:59
[auteur/SERIALNEO/415612.aspx serialneo:]
Ta fonction est une boucle, et ça n'accapare pas toute la mémoire du processeur ?
0

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

Posez votre question
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
21 juin 2008 à 21:44
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.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 juin 2008 à 21:58
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 #   
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
21 juin 2008 à 22:32
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
0
Rejoignez-nous