Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Puntoinfinito en 31 Agosto 2012, 16:37 pm



Título: While and for - No funcionan
Publicado por: Puntoinfinito en 31 Agosto 2012, 16:37 pm
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:
Código:
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:
Código:
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()
       


Título: Re: While and for - No funcionan
Publicado por: seba123neo en 31 Agosto 2012, 17:28 pm
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
  1. Public Class Form1
  2.  
  3.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4.        WebBrowser1.Navigate("http://www.google.com.ar")
  5.    End Sub
  6.  
  7.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  8.        For i As Integer = 1 To 20
  9.            WebBrowser1.Navigate("http://www.google.com.ar")
  10.  
  11.            Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete And WebBrowser1.IsBusy = False
  12.                Application.DoEvents()
  13.            Loop
  14.  
  15.            total.Text = i
  16.        Next
  17.    End Sub
  18. 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.


Título: Re: While and for - No funcionan
Publicado por: Puntoinfinito en 31 Agosto 2012, 17:53 pm
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
Código:
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.


Título: Re: While and for - No funcionan
Publicado por: 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.


Título: Re: While and for - No funcionan
Publicado por: Puntoinfinito en 31 Agosto 2012, 23:31 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?


Título: Re: While and for - No funcionan
Publicado por: Stakewinner00 en 1 Septiembre 2012, 00:09 am
personalmente utilizaria un timer


Título: Re: While and for - No funcionan
Publicado por: seba123neo en 1 Septiembre 2012, 00:12 am
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
  1. Public Class Form1
  2.  
  3.    Private Sub Pausa(ByVal pSegundos As Integer)
  4.        Dim vInicio As Integer = Environment.TickCount()
  5.        While ((Environment.TickCount() - vInicio) <= pSegundos)
  6.            Application.DoEvents()
  7.        End While
  8.    End Sub
  9.  
  10.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  11.        For i As Integer = 1 To 30
  12.            TextBox1.Text = i
  13.            Call Pausa(1000)
  14.        Next
  15.    End Sub
  16. 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.


Título: Re: While and for - No funcionan
Publicado por: Puntoinfinito en 1 Septiembre 2012, 01:05 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
  1. Public Class Form1
  2.  
  3.    Private Sub Pausa(ByVal pSegundos As Integer)
  4.        Dim vInicio As Integer = Environment.TickCount()
  5.        While ((Environment.TickCount() - vInicio) <= pSegundos)
  6.            Application.DoEvents()
  7.        End While
  8.    End Sub
  9.  
  10.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  11.        For i As Integer = 1 To 30
  12.            TextBox1.Text = i
  13.            Call Pausa(1000)
  14.        Next
  15.    End Sub
  16. 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


Título: Re: While and for - No funcionan
Publicado por: Keyen Night en 1 Septiembre 2012, 01:07 am
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...