Re: [delphi-br] Criar Timer para Execução paralela [RESOLVIDO]

2007-02-05 Por tôpico Ricardo César Cardoso
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]

2007-02-05 Por tôpico Ricardo César Cardoso
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

2007-02-01 Por tôpico Ricardo César Cardoso
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

2007-01-31 Por tôpico Ricardo César Cardoso
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

2007-01-31 Por tôpico Rubem Nascimento da Rocha

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