Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008
-
21 juin 2008 à 10:51
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDerniè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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
serialneo
Messages postés6Date d'inscriptionlundi 3 janvier 2005StatutMembreDernière intervention22 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
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 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
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 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