cronometro com ttimer e Tlabel, preciso de ajuda!

Delphi

09/09/2005

Colegas, me deparei com um problema que nunca tinha visto antes!

fiz um cronometro normal, com ttimer e label, coloquei o interval do ttimer para 1 e um botão para iniciar a contagem no formato minuto:segundo:milisegundos. o problema é que o label fica piscando enquanto os números mudam, e o timer tá lento...... numa proporçao de 1/10, ou seja, um décimo de segundo (100 milissegundos) estão demorando um segundo inteiro pra passar.

unit visor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, dateutils;

type
  Tfrmvisor = class(TForm)
    btInicio: TButton;
    btPara: TButton;
    btZera: TButton;
    crono: TTimer;
    lbTempo: TLabel;
    procedure cronoTimer(Sender: TObject);
    procedure btInicioClick(Sender: TObject);
    procedure btParaClick(Sender: TObject);
    procedure btZeraClick(Sender: TObject);
  private
    { Private declarations }
  public
    fTempo: Ttime;
  end;

var
  frmvisor: Tfrmvisor;

implementation

{$R *.dfm}

procedure Tfrmvisor.cronoTimer(Sender: TObject);
begin
  fTempo := ftempo + OneMillisecond;
  lbTempo.Caption := formatdatetime(´hh:nn:ss.zzz´, ftempo);
end;

procedure Tfrmvisor.btInicioClick(Sender: TObject);
begin
  crono.Enabled := true;
end;

procedure Tfrmvisor.btParaClick(Sender: TObject);
begin
  crono.Enabled := false;
end;

procedure Tfrmvisor.btZeraClick(Sender: TObject);
begin
  fTempo := 0;
end;

end.



alguém pode me ajudar?


Vitor Rubio

Vitor Rubio

Curtidas 0

Respostas

Massuda

Massuda

09/09/2005

Parece que você está usando um timer com intervalo de 1ms.

O Windows não garante que seu timer seja disparado nessa frequencia... o que geralmente ocorre é que as mensagems do timer ficam enfileiradas para processamento, o que pode ocorrer num instante completamente diferente do previsto.

Minha sugestão é que você meça o tempo usando a função GetTickCount e use o timer para mostrar o tempo decorrido.

Ficaria algo assim...
type 
  Tfrmvisor = class(TForm) 
    btInicio: TButton; 
    btPara: TButton; 
    btZera: TButton; 
    crono: TTimer; 
    lbTempo: TLabel; 
    procedure cronoTimer(Sender: TObject); 
    procedure btInicioClick(Sender: TObject); 
    procedure btParaClick(Sender: TObject); 
    procedure btZeraClick(Sender: TObject); 
  private 
    tickInicial: DWORD;
    tickFinal: DWORD;
  public 
    fTempo: TTime; 
  end; 

...

procedure Tfrmvisor.cronoTimer(Sender: TObject); 
begin 
  fTempo := (GetTickCount - tickInicial) * OneMillisecond;

  lbTempo.Caption := formatdatetime(´hh:nn:ss.zzz´, ftempo); 
end; 

procedure Tfrmvisor.btInicioClick(Sender: TObject); 
begin 
  tickInicial := GetTickCount;
  crono.Enabled := true; 
end; 

procedure Tfrmvisor.btParaClick(Sender: TObject); 
begin 
  tickFinal := GetTickCount;
  crono.Enabled := false; 

  fTempo := (tickFinal - tickInicial) * OneMillisecond;
end; 

procedure Tfrmvisor.btZeraClick(Sender: TObject); 
begin 
  tickInicial := 0;
  tickFinal := 0;
  fTempo := 0; 
end;
NOTA: tentei não alterar muito seu código.

Use um intervalo de tempo maior para o timer. A contagem de tempo é feita pelo Windows e não mais pelo timer.


GOSTEI 0
Vitor Rubio

Vitor Rubio

09/09/2005

Valeu Massuda, eu já tinha chegado a essa conclusão antes e feito o mesmo código que você, mas só vi a sua resposta agora. Como eu disse, não estou recebendo notificação de resposta por e-mail ultimamente, por isso não cheguei a ver as suas respostas. Agora estou re-lendo todos os tópicos postados por mim.


GOSTEI 0
POSTAR