Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Reiniciar un timer

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Reiniciar un timer Responder citando

Buenas tardes, y un saludo a todos.

Tengo un timer inicializado a 20 milisegundos

Código:


T2_20ms->Interval = 20;
.........
 .......
void __fastcall TForm1::T2_20msTimer(TObject *Sender)
{
    T2_20ms_OverF = true;
    T2_20ms->Enabled = false;
}


el caso es que cada cierto tiempo necesito volver a resetear el timer
es decir, si le quedan 5 milisegundos deseo que no se active y volver a iniciar la cuenta en 20, con lo que hago lo siguiente:

T2_20ms->Enabled = false;
T2_20ms->Interval = 20;
T2_20ms->Enabled = true;

es suficiente? hay alguna manera de saber los milisegundos que faltan para que se vuelva a activar el evento del timer?

Un saludo y gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Que yo sepa no... Pero podrias setear la propiedad de intervalo del timer en 1 milisegundo, y con una variable estatica dentro del evento ontimer contar la cantidad de veces que entro, y asi ejecutar segun esa cantidad de milisegundos transcurridos la funcion que corresponda, por ejemplo:

Código:


T2_20ms->Interval = 1;

void __fastcall TForm1::T2_20msTimer(TObject *Sender)
{
    static long CantMilSeg=0;
    if( CantMilSeg <= 20)
    {
         //codigo...
    }
    else if( CantMilSeg > 20 && CantMilSeg <= 40)
    {
         //codigo...
    }
    else
    {
         //codigo...
    }
    CantMilSeg++;
}


NOTA: Una variable declarada como estatica, en este caso dentro del evento OnTimer, lo que hace es guardar el valor de su contenido, para que pueda ser reutilizado en la proxima llamada a la funcion.
Espero sirva de algo, saludos.
_________________
Il Lupo
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Gracias Lupo.

Esa es la forma en que lo hago cuando programo microcontroladores con interrupciones,
pero pense que en builder con mucha mas memoria podria hacer otro tipo de programacion, si lo hago asi, no puedo usar correctamente los hilos, y el multiproceso por q pierdo la programacion con eventos, ya que tengo q estar pendiente si el tiempo se cumple o no.

Otra cosa, ademas estoy intentado medir los milisegundos del timer
y solo encuentro la funcion

gettime

que me da centesimas de segundo, conoceis alguna para medir milisegundos??

UN saludo y gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si claro, existe una funcion de las API de windwos que se llama GetTickCount, y devuelve si no me equivoco la cantidad de milisegundos que pasaron no recuerdo si desde que se encendio la pc, o desde que se ejecuto la aplicacion o desde una fecha determinada...
En definitiva para medir una cantidad de milisegundos determinada, desde un determinado momento, esta funcion la puedes utilizar de la siguiente manera:

Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
static int a=0;
long tiempoInicial = GetTickCount();
long tiempoActual = tiempoInicial;

while ( tiempoActual - tiempoInicial < 3500 )
{
    Application->ProcessMessages();
    tiempoActual = GetTickCount();
    Edit1->Text = AnsiString((double)(tiempoActual - tiempoInicial)/1000);
}
a++;
Edit2->Text = AnsiString(a);
}


Este pequeño codigo seria un equivalente a un Sleep(3500) con la diferencia que durante la espera procesaria los mensajes de la aplicacion, y dentro del while podrias hacer lo que quieras mientras se ejecuta el bucle.
Si no quedo muy claro, cualquier duda que tengas, pregunta !!
Salu2!
_________________
Il Lupo
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Hola,

Para medir el tiempo con precision, mirate:

https://cppbuilder.es/viewtopic.php?t=9296

Espero que te sirva.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, yo he construido un reloj rapido para medir milisegundos, aunque
no tiene precision de milisegundos si que te da los milisegundos exactos cada vez que entra el timer.

pon el evento del timer a 1, en teoria entraria cada ms, pero ya sabes que no se cumple, eso si cada vez que entres te data el milisegundo exacto en que entraste.

Código:
void __fastcall TForm1::TRelojTimer(TObject *Sender)
{
   String sAux;
   struct timeb stTemporizador;
   static long timeAnt = 0;

   ftime( &stTemporizador);

   if( stTemporizador.time != timeAnt )
   {
     timeAnt = stTemporizador.time;
     Form1->iMilisec = 0;
     if( ++Form1->iSegundos >= 60 )
     {
       Form1->iSegundos = 0;
       if( ++Form1->iMinutos >= 60)
       Form1->iMinutos = 0;
     }
   }

   sAux = FormatFloat("00", Form1->iMinutos ) + ":" +
          FormatFloat("00", Form1->iSegundos ) + ":" +
          FormatFloat( "000",stTemporizador.millitm );

    Form1->PanelReloj->Caption = sAux ;
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.