Spanish Problemas con Sleep al reemplazar DoEvents

desof

Well-Known Member
Licensed User
Longtime User
El IDE y los comentarios me sugieren queno utilice DoEvents que puede dar problemas pero mi aplicacion funciona bien en el código que muestro a continuación y no así cuando reemplazo ese con Sleep(0)
Mi pregunta es ?
Lo puedo seguir utilizando asi ?
Cual es el potencial riesgo ?


B4X:
Sub Activity_Create(FirstTime As Boolean)
   
    If FirstTime Then       
        Activity.LoadLayout("login")
        imgSplash.Visible=True
        Splash       
    Else
        ''
    End If
End Sub

Sub Splash   
    wait(4)
    Activity.Finish
    StartActivity(Main2)   
End Sub


Sub wait(segundos As Int)   
    Dim ti As Long
    ti = DateTime.Now + (segundos * 1000)
    Do While DateTime.Now < ti
        DoEvents ' funciona correcto hace la pausa que necesito
        ' Sleep(0) ' No funciona es como que no existiera y no se realiza ninguna espera.
    Loop
End Sub
 

JCO

Active Member
Licensed User
Longtime User
Yo también he tenido un caso en el que el Sleep no funciona como necesito, mientras que el DoEvents sí. De momento lo he dejado así. El problema, creo, es que está "deprecated", es decir que en futuras versiones de B4A puede dejar de existir.

En el caso de tu código, me pregunto si no podrías sustituir completamente el Loop en algo así:
B4X:
Sub wait(segundos As Int)  
    Sleep(segundos * 1000)
End Sub
 

desof

Well-Known Member
Licensed User
Longtime User
Es exactamente lo que hice y no funciona en absoluto. No se produce ninguna pausa por más que le ponga un valor de 1000 o 20000 milisegundos
 

rscheel

Well-Known Member
Licensed User
Longtime User
Es exactamente lo que hice y no funciona en absoluto. No se produce ninguna pausa por más que le ponga un valor de 1000 o 20000 milisegundos

Has probado colocando el sleep en el Sub Splash

B4X:
Sub Splash  
    Sleep(3000) '3 segundos
    Activity.Finish
    StartActivity(Main2)  
End Sub
 

desof

Well-Known Member
Licensed User
Longtime User
Has probado colocando el sleep en el Sub Splash

B4X:
Sub Splash 
    Sleep(3000) '3 segundos
    Activity.Finish
    StartActivity(Main2) 
End Sub

guau !!! alli tenemos un Bug creo!!!
Sabes que sí funciona de esa manera colocando el Sleep dentro del mismo procedimiento pero no llamandolo desde otro.:(

Ahora parece no andar del todo correcto por que cambie de 3000 a 10000 y no se nota ninguna cambio y es como que tomara algun valor interno nada mas por que en teoria deberia demorar 10 segundos y no son mas de 3 o 4.
 

JCO

Active Member
Licensed User
Longtime User
En este caso, quizás algo de este estilo sería más apropiado ...

B4X:
Sub Globals
    Dim tmr As Timer
   
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        Activity.LoadLayout("login")
        imgSplash.Visible=True
        tmr.Initialize("tmr", 10000)
    Else
        ''
    End If
End Sub

Sub tmr_Tick
    Activity.Finish
    StartActivity(Main2)
End Sub
 

desof

Well-Known Member
Licensed User
Longtime User
ES EXTRAÑO TODO ESTO...
Puse el Timer como indicas y funciona pero al igual que el Sleep le pongo un valor grande de tiempo y no me lo toma.
Puse tmr.Initialize("tmr", 30000) y el tiempo es siempre el mismo que se detiene la app. Es como que el flujo del codigo continua sin importar. que hay
 

IdasI4A

Active Member
Licensed User
Longtime User
Prueba con esto. He cambiado el nombre de la funcion Wait pues ya hay un comnado con ese nombre.
B4X:
Sub Activity_Create(FirstTime As Boolean)
   
   If FirstTime Then
     Activity.LoadLayout("login1")
     imgSplash.Visible=True
     Splash
   Else
     ''
   End If
End Sub

Sub Splash
   wait For(Esperar(4)) complete 
   Activity.Finish
   StartActivity(Main2)
End Sub


Sub Esperar(segundos As Int) As ResumableSub
   Dim ti As Long
   ti = DateTime.Now + (segundos * 1000)
   Do While DateTime.Now < ti
     'DoEvents ' funciona correcto hace la pausa que necesito
      Sleep(0) ' No funciona es como que no existiera y no se realiza ninguna espera.
   Loop
   Return ""
End Sub
 

IdasI4A

Active Member
Licensed User
Longtime User
Y mejor aún:
B4X:
Sub Esperar(segundos As Int) As ResumableSub
   Sleep(segundos*1000)
   Return ""
End Sub
 

desof

Well-Known Member
Licensed User
Longtime User
Definitivamente he probado todas las opciones y lo único que me anda correctamente es asi !

B4X:
Sub Esperar(segundos As Int) 'As ResumableSub
   
    Dim ti As Long
    ti = DateTime.Now + (segundos * 1000)
    Do While DateTime.Now < ti
        DoEvents       
    Loop
End Sub

Gracias a todos por su ayuda!
 
Top