Re: [delphi-br] Criar Timer para Execução paralela [RESOLVIDO]
Boa tarde João! Olha, meu amigo, vc é fera mesmo! O abacaxi já tá totalmente descascado! Só fiz a alteração de mais um detalhezinho pra gente poder saborear o dito cujo... O projeto funcionou perfeitamente! MUITISSIMO OBRIGADO, vc não sabe o quanto me ajudou. Fiz as alterações como vc sugeriu e as units ficaram com abaixo: ( Unit do Cronômetro *) type TfrmCrometro = class(TForm) {...} procedure ComPortError(Sender: TObject; Errors: TComErrors); procedure FinalizaCronometro(Sender: TObject); procedure CriaTimer; {...} public { Public declarations } Iniciado : Boolean; // Flag do primeiro sinal da porta HoraIni : TDateTime; // Data e hora do recebimento do primeiro sinal MyTimer : TTimer; // Objeto Timer criado dinamicamente 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 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. // Código de criação da Thread - Como Fazer? // Seria assim? with TThreadMonitora.Create(True) do begin Priority := tpLowest; // baixei mais ainda a prioridade StartTime := HoraIni; Started := @Iniciado; Resume; end; end else begin MyTimer.Free; CriaTimer; end; End; Procedure TfrmCrometro.FinalizaCronometro(Sender: TObject); Begin if Iniciado then // aqui foi a jogada de mestre. para o contador visual begin Iniciado := False; Label1.Caption := FormatDateTime('hh:mm:ss:zzz', Now - HoraIni); end End; Procedure TfrmCrometro.CriaTimer; Begin MyTimer := TTimer.Create(Self); with MyTimer do begin Interval := 125; Name := 'DynaTimer'; OnTimer := FinalizaCronometro; end; End; {...} () (* Unit da Thread de contagem ) unit ThreadMonitora; interface uses Classes, SysUtils, Windows; type TThreadMonitora = class(TThread) private { Private declarations } FStartTime : TDateTime; protected procedure Execute; override; procedure AtualizaLabel; public Started: ^Boolean; property StartTime: TDateTime read FStartTime write FStartTime; end; implementation uses uCronometro; { 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. (**) __ 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]
Re: [delphi-br] Criar Timer para Execução paralela [RESOLVIDO]
Vou testar essa dica aí que vc passou. Qualquer coisa, te informo! Sds, Ricardo. Joao Morais [EMAIL PROTECTED] escreveu: Ricardo César Cardoso wrote: Boa tarde João! Olha, meu amigo, vc é fera mesmo! O abacaxi já tá totalmente descascado! Só fiz a alteração de mais um detalhezinho pra gente poder saborear o dito cujo... O projeto funcionou perfeitamente! MUITISSIMO OBRIGADO, vc não sabe o quanto me ajudou. Olá Ricardo. Disponha! Obrigado por seu retorno, bom saber que deu tudo certo. Depois você tira a poupa desse abacaxi, separa metade e manda aqui pra gente fazer um suco :-)) Fiz as alterações como vc sugeriu e as units ficaram com abaixo: Ficou legal. Estive olhando a implementação do ttimer e verifiquei um truque para você resetar o timer. Ao invés de destruí-lo e recriá-lo a cada 1ms, tente apenas reassociar o evento ontimer. Se funcionar, de cara você economiza 2000 alocações+liberações de memória por segundo. -- João Morais ( Unit do Cronômetro *) type TfrmCrometro = class(TForm) {...} procedure ComPortError(Sender: TObject; Errors: TComErrors); procedure FinalizaCronometro(Sender: TObject); procedure CriaTimer; {...} public { Public declarations } Iniciado : Boolean; // Flag do primeiro sinal da porta HoraIni : TDateTime; // Data e hora do recebimento do primeiro sinal MyTimer : TTimer; // Objeto Timer criado dinamicamente 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 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. // Código de criação da Thread - Como Fazer? // Seria assim? with TThreadMonitora.Create(True) do begin Priority := tpLowest; // baixei mais ainda a prioridade StartTime := HoraIni; Started := @Iniciado; Resume; end; end else begin MyTimer.Free; CriaTimer; end; End; Procedure TfrmCrometro.FinalizaCronometro(Sender: TObject); Begin if Iniciado then // aqui foi a jogada de mestre. para o contador visual begin Iniciado := False; Label1.Caption := FormatDateTime('hh:mm:ss:zzz', Now - HoraIni); end End; Procedure TfrmCrometro.CriaTimer; Begin MyTimer := TTimer.Create(Self); with MyTimer do begin Interval := 125; Name := 'DynaTimer'; OnTimer := FinalizaCronometro; end; End; {...} () (* Unit da Thread de contagem ) unit ThreadMonitora; interface uses Classes, SysUtils, Windows; type TThreadMonitora = class(TThread) private { Private declarations } FStartTime : TDateTime; protected procedure Execute; override; procedure AtualizaLabel; public Started: ^Boolean; property StartTime: TDateTime read FStartTime write FStartTime; end; implementation uses uCronometro; { 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. (**) __ 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]
Re: [delphi-br] Criar Timer para Execução paralela
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]
[delphi-br] Criar Timer para Execução paralela
Boa tarde amigos da lista. Estou com um problema aqui cuja lógica não estou conseguindo implementar. Estou desenvolvendo uma aplicação que deve monitorar por quanto tempo um dispositivo ligado a porta COM ficou acionado. Para isso foi desenvolvido um hardware que fica ligado a porta COM do PC enviando um sinal enquanto o botão do equipamento estiver acionado. Tentei implementar a aplicação usando um timer e tratando o evento que vem da porta COM, já que nesse caso não há nenhum protocolo de comunicação implementado no hardware. Enquanto esse evento estivesse ocorrendo, o timer permaneceria habilitado, porém não sei onde implementar esse procedimento. Porém, acredito que o problema possa ser resolvido com threads. A lógica seria a seguinte: quando eu recebo o primeiro sinal, a thread com o contador fica habilitada. Enquanto o evento estiver ocorrendo, o timer estará habilitado. Quando o último sinal chegar a porta (o equivalente ao hardware interromper o acionamento), eu interrompo a thread e gravo o tempo em que a thread ficou em execução. Um outro problema que vejo também é como mostrar em tempo de execução o tempo em que o dispositivo já está acionado. Porém grande problema reside no fato que nunca fiz aplicações com o uso de threads. Tentei interpretar alguns dos exemplos mas não consigo achar nada próximo ao que eu quero (o que seria pedir demais) ou sequer didático como uma receita de bolo. Se alguém já passou por essas situações acima e puder colaborar, agradeço muito. []'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]
RE: [delphi-br] Criar Timer para Execução paralela
Sugiro que vc informe-se sobre o componente TComPort. Estude o(s) exemplo(s) e (principalmente) o código fonte do componente, pq ele possui um esquema de monitoramento da porta serial que usa threads. Sei disso pq usei ele em um projeto de software em linha de produção no ano passado. Não passo 'receita de bolo', muito menos o peixe pronto pra comer, mas essa é a orientação pra vc pescar o peixe. Boa sorte. From: Ricardo César Cardoso [EMAIL PROTECTED] Reply-To: delphi-br@yahoogrupos.com.br To: delphi-br@yahoogrupos.com.br Subject: [delphi-br] Criar Timer para Execução paralela Date: Wed, 31 Jan 2007 14:28:25 -0300 (ART) Boa tarde amigos da lista. Estou com um problema aqui cuja lógica não estou conseguindo implementar. Estou desenvolvendo uma aplicação que deve monitorar por quanto tempo um dispositivo ligado a porta COM ficou acionado. Para isso foi desenvolvido um hardware que fica ligado a porta COM do PC enviando um sinal enquanto o botão do equipamento estiver acionado. Tentei implementar a aplicação usando um timer e tratando o evento que vem da porta COM, já que nesse caso não há nenhum protocolo de comunicação implementado no hardware. Enquanto esse evento estivesse ocorrendo, o timer permaneceria habilitado, porém não sei onde implementar esse procedimento. Porém, acredito que o problema possa ser resolvido com threads. A lógica seria a seguinte: quando eu recebo o primeiro sinal, a thread com o contador fica habilitada. Enquanto o evento estiver ocorrendo, o timer estará habilitado. Quando o último sinal chegar a porta (o equivalente ao hardware interromper o acionamento), eu interrompo a thread e gravo o tempo em que a thread ficou em execução. Um outro problema que vejo também é como mostrar em tempo de execução o tempo em que o dispositivo já está acionado. Porém grande problema reside no fato que nunca fiz aplicações com o uso de threads. Tentei interpretar alguns dos exemplos mas não consigo achar nada próximo ao que eu quero (o que seria pedir demais) ou sequer didático como uma receita de bolo. Se alguém já passou por essas situações acima e puder colaborar, agradeço muito. []'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] _ MSN Messenger: converse com os seus amigos online. http://messenger.msn.com.br