PDA

Ver la Versión Completa : [TTimer] Ver tiempo actual para completar el ciclo de un Timer


MAXIUM
24-06-2017, 01:37:37
Hola la idea es la siguiente,

Si programo una tarea que se ejecuta cada 30.000 milesegundos en el evento OnTimer de un TTimer, ¿como puedo mostrar por pantalla cuantos milesegundos o segundos lleva hasta el momento para completar esos 30 segundos.

O explicado en otras palabras. Si se ejecuta cada 30 segundos una tarea o proceso, ¿como puedo ver en un TLabel lo siguiente?

...
22
23
24
25
26
27
...

dec
24-06-2017, 18:23:48
Hola Maxium,

30.000 milisegundos son 30 segundos, estaremos de acuerdo. Pues bien, puedes usar una variable donde almacenar los segundos que se llevan "contados". Si quiere mostrarlos tal que: 1, 2, 3, 4, etc., en cada evento "Interval" del Timer tendrás que incrementar el valor de dicha variable. Si quieres mostrar los segundos tal que: 29, 28, 27, etc., deberás hacer lo contrario, esto es, decrementar el valor de la variable. En en primer caso la variable parte de 0 y en el segundo caso parte de 30. Dicha variable podrás mostrarla en un "Label" o en el control que prefieras.

ecfisa
25-06-2017, 14:36:48
Hola.

A mi me queda la duda de si el conteo debe mostrar los segundos transcurridos o faltantes para cada temporización del timer, es decir para cada vez que se dispare el evento OnTimer. Si eso es lo que deseas, vas a necesitar un segundo temporizador para que realize la tarea del conteo entre eventos (del modo que te comentó dec) ya que el TTimer no contempla esa posibilidad.

Un ejemplo:

...
var
Lapso: Integer = 0; // contador

// OnTimer 30 segundos
procedure TForm1.Timer30Timer(Sender: TObject);
begin
try
ShowMessage( '30 segundos' ); // Acción que se desata cada 30 segs.
finally
Lapso := 0;
end;
end;

// OnTimer 1 segundo
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Inc( Lapso );
Label1.Caption := Format( '%d s.', [Lapso] );
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
Timer30.Interval := 30000; // 30 s
Timer30.Enabled := True;
Timer1.Interval := 1000; // 1 s
Timer1.Enabled := True;
end;


Saludos :)

dec
25-06-2017, 19:41:53
Hola a todos,

Yo, lo que diga ecfisa. :D

ecfisa
25-06-2017, 20:26:51
Hola a todos,

Yo, lo que diga ecfisa. :D
¡ No hombre !:D que bién pude equivocar la interpretación y él querer otra cosa, ya nos especificará MAXIUM que es lo que anda necesitando.

Saludos :)

dec
25-06-2017, 21:48:27
¡Hola a todos!

¡ No hombre !:D que bién pude equivocar la interpretación y él querer otra cosa, ya nos especificará MAXIUM que es lo que anda necesitando.

Saludos :)

Nada, nada... excusas. Yo lo que digas tú hasta el final. ¡Lo digo muy en serio! :) :D

MAXIUM
27-06-2017, 03:16:43
Hola que tal,

Me refería a los segundos transcurridos.

Sin embargo, es útil saber el proceso inverso para ver los segundos o tiempo faltante, y usarlo en algún proyecto futuro. Sino es por mi, será por alguien más.

Por lo tanto, agradezco vuestra colaboración ^\||/

Ñuño Martínez
27-06-2017, 10:45:33
Lo más "fácil" sería usar dos TTimer: uno para los 30 segundos y otro para cada segundo, tal como comenta ecfisa, pero yo usaría sólo un TTimer que se activara cada segundo y fuera actualizando una variable (o el propio "Tag" del componente) y el TLabel hasta llegar a treinta, más o menos así:

INTERFACE

TYPE
(* El formulario. *)
TMiForm = CLASS (TForm)
ElTimer: TTimer;
ElLabel: TLabel;

PROCEDURE onTimerTick (Sender: TObject);
{ ... }
PRIVATE
fContador: INTEGER = 0;
{ ... }
END;

IMPLEMENTATION

{ ... }

PROCEDURE TMiForm.onTimerTick (Sender: TObject);
BEGIN
INC (fContador);
IF fContador >= 30 THEN
BEGIN
{ Aquí se hace la operación que se requiera, o se activa un evento, o lo que sea
y se reinicia el contador. }
fContador := 0
END;
ElLabel.Caption := IntToStr (fContador)
END;

{ ... }

Las ventajas son que usas menos recursos (y aún menos si en vez del campo fContador usas la propiedad Tag del TTimer), pero principamente evitaras tener que sincronizar dos TTimer diferentes, que puede parecer que no pero puede dar problemas.