 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
pirupic Ens


Registrado: 25 Feb 2004Mensajes: 28Ubicación: Madrid
|
Publicado: Mar 21 Feb, 2006 4:28 pm Asunto: Reiniciar un timer |
|
|
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 |
|
 |
Lupo Ens

Registrado: 15 Ago 2005Mensajes: 30Ubicación: Prov, Buenos Aires - Argentina
|
Publicado: Mie 22 Feb, 2006 8:18 am Asunto: |
|
|
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 |
|
 |
pirupic Ens


Registrado: 25 Feb 2004Mensajes: 28Ubicación: Madrid
|
Publicado: Mie 22 Feb, 2006 9:31 am Asunto: |
|
|
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 |
|
 |
Lupo Ens

Registrado: 15 Ago 2005Mensajes: 30Ubicación: Prov, Buenos Aires - Argentina
|
Publicado: Jue 23 Feb, 2006 9:03 pm Asunto: |
|
|
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 |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
|
| Volver arriba |
|
 |
pirupic Ens


Registrado: 25 Feb 2004Mensajes: 28Ubicación: Madrid
|
Publicado: Mie 27 Nov, 2013 10:37 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|