Boa tarde João! Vc já está começando a salvar a minha pele... Ainda estou com umas dúvidas aqui no procedimento que vc passou:
Tentei seguir o que vc sugeriu, mas ainda estou tendo problemas. Agora quando aciono o botão do dispositivo, normal, inicia a execução do timer, porém quando eu solto o botão do dispositivo que fica enviando pulsos o timer não para a contagem. Acredito que o problema seja o ComPort, pq ele também usa Threads para monitorar os eventos da porta. Estou anexando o código da thread que eu criei de acordo com o que compreendi das suas orientações iniciais e a implementação das chamadas do s/w. Será que vc ou alguma outra alma caridosa poderiam me ajudar? (************************** Unit Cronômetro (principal) *******************************) {...} public { Public declarations } Iniciado : Boolean; // Flag do primeiro sinal da porta HoraIni : TDateTime; // Data e hora do recebimento do primeiro sinal end; {...} {...} implementation {$R *.dfm} uses ThreadMonitora; {...} {...} Procedure TfrmCrometro.ComPort1Error(Sender: TObject; Errors: TComErrors); // Este evento se repete enquanto o botão do hardware está acionado // ele fica mandando pulsos para o computador a cada 1ms Var aTimer : TTimer; Begin if not Iniciado then begin HoraIni := Now; // implementei a inicialização dentro de um TButtom Iniciado := True; // Esse seria o flag da recepção do primeiro evento. // Criação do Timer dinâmico aTimer := TTimer.Create(Self); with aTimer do begin Interval := 2000; Name := 'DynaTimer'; OnTimer := FinalizaCronometro; end; // Código de criação da Thread - Como Fazer? // Seria assim? with TThreadMonitora.Create(True) do begin Priority := tpLower; StartTime := HoraIni; Started := Iniciado; Resume; end; end else begin if Assigned(aTimer) then aTimer.Free; // ou seria melhor aTimer.Destroy ? end; End; Procedure TfrmCrometro.FinalizaCronometro(Sender: TObject); Begin Iniciado := False; Label1.Caption := FormatDateTime('hh:mm:ss:zzz', Now - HoraIni); End; {...} (********************************************************************************************) (********************************* Thread de Monitoração *******************************) (*** Está numa unit a parte *****) unit ThreadMonitora; interface uses Classes, SysUtils, Windows; type TThreadMonitora = class(TThread) private { Private declarations } FStartTime : TDateTime; FStarted : Boolean; protected procedure Execute; override; procedure AtualizaLabel; public property StartTime: TDateTime read FStartTime write FStartTime; property Started : Boolean read FStarted write FStarted; end; implementation uses uCronometro; { Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TThreadMonitora.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; } { TThreadMonitora } Procedure TThreadMonitora.AtualizaLabel; Begin frmCrometro.Label1.Caption := FormatDateTime('hh:mm:ss:zzz', Now - StartTime); End; Procedure TThreadMonitora.Execute; Begin { Place thread code here } while Started do Synchronize(AtualizaLabel); End; END. (*********************************************************************************************) []'s Ricardo. __________________________________________________ Fale com seus amigos de graça com o novo Yahoo! Messenger http://br.messenger.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas]