While and for - No funcionan

Iniciado por Puntoinfinito, 31 Agosto 2012, 16:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Puntoinfinito

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()
       
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

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:

Código (vbnet) [Seleccionar]
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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Puntoinfinito

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.
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Puntoinfinito

Cita de: seba123neo en 31 Agosto 2012, 20:39 PM
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?
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

Stakewinner00


seba123neo

Cita de: puntoinfinito en 31 Agosto 2012, 23:31 PM
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.

Código (vbnet) [Seleccionar]
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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Puntoinfinito

Cita de: seba123neo en  1 Septiembre 2012, 00:12 AM
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.

Código (vbnet) [Seleccionar]
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.

Cita de: Stakewinner00 en  1 Septiembre 2012, 00:09 AM
personalmente utilizaria un timer

Eso he echo xDDD
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

Keyen Night

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...
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...