Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Dunkansdk en 14 Febrero 2011, 04:15 am



Título: Bucle por tiempo
Publicado por: Dunkansdk en 14 Febrero 2011, 04:15 am
Hola a todos quería saber como crear un bucle que tarde X tiempo la ejecución, es decir la duración del mismo

var = 0
Do While var < 255
var = var + 1
Loop
por poner un ejemplo estúpido xd ...

Que de llegar de 1 a 255 tarde 1 segundo (1000ms), por ejemplo... la idea sería no utilizar timers y hacer una función xd ,

Si alguien me puede ayudar, muchas gracias .


Título: Re: Bucle por tiempo
Publicado por: ignorantev1.1 en 14 Febrero 2011, 04:19 am
Código
  1. private declare sub Sleep lib "kernel32.dll"(byval mms as long)
  2.  
  3. ...
  4. for i=0 to 10
  5.      doevents
  6.     sleep(100) '<---- milisegundos
  7. next
  8.  


Título: Re: Bucle por tiempo
Publicado por: 79137913 en 14 Febrero 2011, 04:22 am
HOLA!!!

Yo lo haria con Doevents y GetTickCount para saber cuanto tiempo vas...

El problema de Sleep es que te congela la pc osea No permite ninguna otra ejecucion simultanea, cosa que doevents si permite  ::)

GRACIAS POR LEER!!!


Título: Re: Bucle por tiempo
Publicado por: Dunkansdk en 14 Febrero 2011, 04:26 am
HOLA!!!

Yo lo haria con Doevents y GetTickCount para saber cuanto tiempo vas...

El problema de Sleep es que te congela la pc osea No permite ninguna otra ejecucion simultanea, cosa que doevents si permite  ::)

GRACIAS POR LEER!!!

Es justamente lo que tenía en mente pero no me salía, un ejemplo por favor? (A)

de todos modos muchas gracias por responder ignorantev1.1 u.u


Título: Re: Bucle por tiempo
Publicado por: ignorantev1.1 en 14 Febrero 2011, 04:26 am
cierto amigo, se me paso lo de "doevents"  :)


Título: Re: Bucle por tiempo
Publicado por: 79137913 en 14 Febrero 2011, 13:01 pm
HOLA!!!

Bueno aca lo tenes, ejecutara el codigo una vez por cada intervalo de tiempo.

Te dejo las 2 maneras que se me ocurrieron: (prefiero la primera)

Código
  1. Private Declare Function GetTickCount Lib "kernel32" () As Long
  2.  
  3. Private Sub Bucle()
  4.    Dim X As Long
  5.    Dim Milisec As Long 'cantidad de milisegundos por bucle
  6.    Dim Vueltas As Long 'cantidad de vueltas
  7.    Dim Time_Start As Long
  8.    Milisec = 1000
  9.    Vueltas = 10
  10.    Time_Start = GetTickCount()
  11.    For X = 1 To Vueltas
  12.        'Codigo a ejecutar si queres que lo haga apenas empieza el bucle sino lee abajo.
  13.        Do While Time_Start - getticount() < Milisec
  14.            DoEvents
  15.        Loop
  16.        Time_Start = Time_Start + Milisec
  17.        'El codigo a ejecutar si queres que lo haga despues del primer intervalo sino lee arriba.
  18.    Next
  19. End Sub

Código
  1. Private Declare Function GetTickCount Lib "kernel32" () As Long
  2.  
  3. Private Sub Bucle()
  4.    Dim X As Long
  5.    Dim Flag As Boolean ' Si esta en true Ejecuta el codigo
  6.    Dim Milisec As Long 'cantidad de milisegundos por bucle
  7.    Dim Vueltas As Long 'cantidad de vueltas
  8.    Dim Time_Start As Long
  9.    Milisec = 1000
  10.    Vueltas = 10
  11.    Flag = True ' aca si queres que la primera ejecucion sea cuando pase el primer intervalo quita esta linea
  12.    Time_Start = GetTickCount()
  13.    Do While X <= Vueltas
  14.        DoEvents
  15.        If Flag Then
  16.            'El codigo a ejecutar
  17.            Flag = False
  18.        End If
  19.        If (Time_Start - GetTickCount()) >= Milisec Then
  20.            X = X + 1
  21.            Flag = True
  22.            Time_Start = Time_Start + Milisec
  23.        End If
  24.  
  25.    Wend
  26. End Sub

GRACIAS POR LEER!!!


Título: Re: Bucle por tiempo
Publicado por: raul338 en 14 Febrero 2011, 16:04 pm
puedes usar el api settimer con un callback (funcion publica en un modulo). O bien usar el gettickcount(o QueryPerformanceCounter si queres complicarla) con doevents. BlackZeroX tiene una alternativa con PostMessage y PeekMessage


Título: Re: Bucle por tiempo
Publicado por: 79137913 en 14 Febrero 2011, 16:37 pm
HOLA!!!

Nota: El codigo que escribi puede llegar a tener un minimo desfasaje.

GRACIAS POR LEER!!!


Título: Re: Bucle por tiempo
Publicado por: Dunkansdk en 14 Febrero 2011, 17:47 pm
Muchas gracias a todos !!! lo terminé realizando de esta manera  :rolleyes: :
Código
  1. Private Declare Function SetTimer Lib "user32.dll" ( _
  2.    ByVal hwnd As Long, _
  3.    ByVal nIDEvent As Long, _
  4.    ByVal uElapse As Long, _
  5.    ByVal lpTimerFunc As Long _
  6.    ) As Long
  7.  
  8. Private Declare Function KillTimer Lib "user32.dll" ( _
  9.    ByVal hwnd As Long, _
  10.    ByVal nIDEvent As Long _
  11.    ) As Long
  12.  
  13. Private Const m_nIDEvent = 1
  14. Private Const m_uElapse = 20
  15.  
  16. Private Sub Tick()
  17.    If var <> 150 Then
  18.        var = var + 1
  19.    End If
  20. End Sub
  21.  
  22. Public Sub SetMyTimer(Form As Form)
  23.  Dim retval As Long
  24.    retval = SetTimer(Form.hwnd, m_nIDEvent, m_uElapse, AddressOf Tick)
  25. End Sub
  26.  
  27. Public Sub KillMyTimer(Form As Form)
  28.  Dim retval As Long
  29.    retval = KillTimer(Form.hwnd, m_nIDEvent)
  30. End Sub


Título: Re: Bucle por tiempo
Publicado por: BlackZeroX en 15 Febrero 2011, 04:17 am
.
Puedes usar Wait() (http://infrangelux.hostei.com/index.php?option=com_content&view=article&id=6:artwait&catid=2:catprocmanager&Itemid=8)

Código
  1.  
  2. do
  3.    msgbox "Hola Mundo"
  4.    Wait segundos, 10, false
  5. loop
  6.  
  7.  

Temibles Lunas!¡.