Fórum cronometro com ttimer e Tlabel, preciso de ajuda! #294938
09/09/2005
0
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.
alguém pode me ajudar?
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
Curtir tópico
+ 0
Responder
Posts
09/09/2005
Massuda
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...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.
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;
Use um intervalo de tempo maior para o timer. A contagem de tempo é feita pelo Windows e não mais pelo timer.
Responder
Gostei + 0
26/10/2005
Vitor Rubio
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.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)