Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Manejar Tiempo

Iniciado por sebastianarroyo, 20 de Noviembre de 2005, 01:37:17 AM

« anterior - próximo »

sebastianarroyo

 Hola, en esta oportunidad estoy tratando de logra lo siguiente y realmente no se como hacerlo.-

For a = 0 To 255
Label1.Caption = a
Next a

Necesito que label1 valla subiendo de a poco, es decir: la suba de 0 a 255 tiene que durar un tiempo que yo lo pueda detrminar ( ejemplo:1 segundo )
Antes lo realizaba con un sleep a referencia de "kernel32" , el problema es que me dormia todo el proyecto y da la sensacion de conjelamiento.-
Si alguien sabe como puedo hacer para realizar esto se lo agradezco.-
Sebastian !

Lex


shephiroth

 Buenas.

Si estas usando el namespace System, el siguiente codigo te puede servir:

static System::DateTime diferencia = new System::DateTime(0,0,0,0,0,1); // Especifica 1 segundo
static System::DateTime anterior = new System::DateTime::get_Now();
System::DateTime actual = new System::DateTime::get_now();
if ( (actual - anterior) > diferencia)
{
//codigo q quieras q haga
anterior = System::DateTime::get_Now();
}


Si no estas usando ese namespace, bien puedes usar este pequeño truco xDD

static DWORD diferencia = 1000; //Especifica 1000 milisegundos = 1 segundo
static DWORD anterior = getTickCount();
DWORD actual = getTickCount();
if ( (actual-anterior) > diferencia)
{
//codigo q quieres q se haga
anterior = getTickCount();
}


Este segundo necesita un pequeño arreglo, pero como ves es muy parecido al anterior. El problema q tiene es q puede darse el caso q anterior > actual, en cuyo caso nunca jamas podrías reentrar dentro. Se podría solucionar cambiando el if........
if ( (actual - anterior) > diferencia) || ( anterior > actual && actual > diferencia)

En cualquier caso, suerte ^^

samsaga2

 La solucion optima es la que ha propuesto Lex tira de un timer lo programas cada segundo y alli ya haces lo que quieres. La solucion de shephiroth estaba bien en tiempos de ms-dos en donde no tenias que preocuparte por la carga en la CPU, consumir el 100% de CPU para hacer una simple pausa...

No se que version de Visual Basic estas usando pero si usas VB.Net hay una funcion sleep en el modulo de threads (no me la se de memoria). Si en cambio la version anterior de VB... que dios te ampare XD

zupervaca

Cita de: "samsaga2"La solucion optima es la que ha propuesto Lex tira de un timer lo programas cada segundo y alli ya haces lo que quieres. La solucion de shephiroth estaba bien en tiempos de ms-dos en donde no tenias que preocuparte por la carga en la CPU, consumir el 100% de CPU para hacer una simple pausa...

No se que version de Visual Basic estas usando pero si usas VB.Net hay una funcion sleep en el modulo de threads (no me la se de memoria). Si en cambio la version anterior de VB... que dios te ampare XD
sin entrar en flames ni cosas raras, creo que windows no hace los timers de forma magica, no obstante como windows nos da esa funcionalidad debemos de usarla

[EX3]

 
Cita de: "samsaga2"No se que version de Visual Basic estas usando pero si usas VB.Net hay una funcion sleep en el modulo de threads (no me la se de memoria). Si en cambio la version anterior de VB... que dios te ampare XD
Ya 'tamos' con las coñas? :P

Tres opciones validas en Visual Basic 6.0:

  • Utilizar un control Timer, lo mas sencillo oviamente, para ejecutar operaciones cada x tiempo.

  • Te haces un bucle retardado con la funcion Sleep() del API de Windows.
    Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
  • Te haces un Timer "por codigo" a traves del API de Windows. Sus ventajas frente a los anteriores:
    • No requieres instanciar un control en un formulario pudiendo prescindir de formularios si fuese necesario.
    • Este metodo no "duerme" al programa en la espera de tiempo como ocurre con Sleep() pudiendo hacer otras operaciones simultaneamente mientras se ejecuta el evento del Timer (digamos que simula programacion multi-thread o multi-hilo)
      '// Crea un Timer con un intervalo de tiempo definido en milisegundos y un procedimiento asociado como evento:
      Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

      '// Destruye un Timer:
      Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long

      Para asociar un procedimiento al Timer deberas pasarle su direccion mediante la instruccion AddressOf:
      AddressOf MiRutina
      Importante, el procedimiento que asocies al Timer debe estar declarado obligatoriamente en un modulo *.bas, de lo contrario no funcionara.

      Un sencillo ejemplo de este metodo:
      Codigo Form1
      Option Explicit

      Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

      Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long

      Dim TimerId As Long

      Public Var As Long

      Private Sub Form_Load()
      TimerId = SetTimer(Me.hWnd, 0, 1000, AddressOf MiRutinaDeEvento)
      End Sub

      Private Sub Form_Unload(Cancel As Integer)
      KillTimer Me.hWnd, TimerId

      End Sub

      Codigo Module1.bas
      Option Explicit

      Public Sub MiRutinaDeEvento()
      Form1.Var = Form1.Var + 1

      Form1.Cls
      Form1.Print Form1.Var

      End Sub
    Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.