Autor
|
Tema: While and for - No funcionan (Leído 4,470 veces)
|
Puntoinfinito
Desconectado
Mensajes: 919
#! /win/archlinux
|
Buenas. Mirad, tengo un proyecto, que consiste en hacer un visitador de pagina web masivo. Tengo todo el código echo, pero no me va. He probado dos tipos de funciones pero ninguna de las dos, he leído y reeleido pero nada, así que he publicado. Mirad, esto sería probando con While:Navegador.navigate(txt_direccion.text) Button1.Hide() Button2.Show() total.text = 1 Dim counter As Integer = 0 While counter < 20 counter += 1 ' Insert code to use current value of counter. If total.Text = 1 Then Navegador.Refresh() End While Pero solo se abre la pagina que has indicado y nada, ni se molesta en refrescarse. Luego con FOR: Navegador.navigate(txt_direccion.text) Button1.Hide() Button2.Show() total.text = 1 Dim i As Integer = 0 For i = 1 to 20 If total.Text = 1 Then Navegador.Refresh()
|
|
|
En línea
|
|
|
|
seba123neo
|
el tema es que el webbrowser ejecuta tan rapido el .Refresh() que parece que no funciona. para volver a cargar la pagina directamente ejecuta de nuevo el Navigate(), algo asi, esto funciona: Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load WebBrowser1.Navigate("http://www.google.com.ar") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 1 To 20 WebBrowser1.Navigate("http://www.google.com.ar") Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete And WebBrowser1.IsBusy = False Application.DoEvents() Loop total.Text = i Next End Sub End Class
otra cosa que hace el codigo, y es vital, es preguntar si el webbrowser esta ocupado cargando la pagina, porque sino lo ejecuta tan rapido, que al no terminar de cargar la pagina parece que lo hace solo 1 ves, de esta forma te carga realmente 20 veces la pagina. saludos.
|
|
|
En línea
|
|
|
|
Puntoinfinito
Desconectado
Mensajes: 919
#! /win/archlinux
|
Tienes razón, añadí un label que cada vez que se repetía el ciclo for sumara +1 de propiedad y lo sumó... Va tan rápido que no se ve. He pensado que igual añadiendo System.Threading.Thread.Sleep(1000) como pausa de un segundo justo abajo de "next", hará que los comandos se ejecuten más bien y se pueda apreciar el refresh(). Saludos y thnx.
|
|
|
En línea
|
|
|
|
seba123neo
|
al usar Sleep ya que traba toda la aplicacion (en este caso es solo 1 segundo asi que casi ni lo notas), pero mejor es usar Application.DoEvents para generar un retraso, y en ese retraso vas a poder mover la pantalla sin que se trabe.
|
|
|
En línea
|
|
|
|
Puntoinfinito
Desconectado
Mensajes: 919
#! /win/archlinux
|
al usar Sleep ya que traba toda la aplicacion (en este caso es solo 1 segundo asi que casi ni lo notas), pero mejor es usar Application.DoEvents para generar un retraso, y en ese retraso vas a poder mover la pantalla sin que se trabe.
A este comando se le pueden añadir segundos?
|
|
|
En línea
|
|
|
|
|
seba123neo
|
A este comando se le pueden añadir segundos?
no se puede directamente, para simular una demora o pausa (tipo sleep pero sin que se trabe todo), debes hacer un bucle que ejecute el Application.DoEvents() y que termine cuando se cumpla una condicion, en este caso cuando se cumpla la cantidad de segundos que vos quieras, te haces una simple funcion y la llmas con los segundos como parametro, asi se hace tambien en visual basic 6, aca te paso un ejemplo de pausa que no traba la aplicacion. Public Class Form1 Private Sub Pausa(ByVal pSegundos As Integer) Dim vInicio As Integer = Environment.TickCount() While ((Environment.TickCount() - vInicio) <= pSegundos) Application.DoEvents() End While End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 1 To 30 TextBox1.Text = i Call Pausa(1000) Next End Sub End Class
al apretar el boton se va sumando 1 al valor del textbox y con una pausa de 1 segundo, esta no traba la pantalla y podes mover los controles y la pantalla. sin embargo dicen que el DoEvents ocupa mucho procesador, pero bueno no creo que sea tan drastico. la otra es usar Threads. saludos.
|
|
|
En línea
|
|
|
|
Puntoinfinito
Desconectado
Mensajes: 919
#! /win/archlinux
|
no se puede directamente, para simular una demora o pausa (tipo sleep pero sin que se trabe todo), debes hacer un bucle que ejecute el Application.DoEvents() y que termine cuando se cumpla una condicion, en este caso cuando se cumpla la cantidad de segundos que vos quieras, te haces una simple funcion y la llmas con los segundos como parametro, asi se hace tambien en visual basic 6, aca te paso un ejemplo de pausa que no traba la aplicacion. Public Class Form1 Private Sub Pausa(ByVal pSegundos As Integer) Dim vInicio As Integer = Environment.TickCount() While ((Environment.TickCount() - vInicio) <= pSegundos) Application.DoEvents() End While End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 1 To 30 TextBox1.Text = i Call Pausa(1000) Next End Sub End Class
al apretar el boton se va sumando 1 al valor del textbox y con una pausa de 1 segundo, esta no traba la pantalla y podes mover los controles y la pantalla. sin embargo dicen que el DoEvents ocupa mucho procesador, pero bueno no creo que sea tan drastico. la otra es usar Threads. saludos. Gran función!:D Funciona a la perfección, gracias. personalmente utilizaria un timer
Eso he echo xDDD
|
|
|
En línea
|
|
|
|
Keyen Night
Desconectado
Mensajes: 496
Nothing
|
DoEvents, es una opción siempre que no la vayas a usar por mucho tiempo, yo usaría Threads o Timers DoEvents es más como para esperar eventos que están a punto de suceder a muy pocos segundos o milisegundos...
|
|
|
En línea
|
La Fé Mueve Montañas... ...De Dinero
La programación es más que un trabajo es más que un hobby es una pasión...
|
|
|
|
|