Bom dia, João e amigos da lista! João, a dica que vc passou eu não consegui implementar, mas de qualquer maneira, o programa já tinha ficado em otimizado já na primeira tentativa.
Porém surgiu um probleminha: O programa foi compilado usando Windows XP Pro com SP2 num P4 2.8GHz e 512 MB RAM e funcionou a contento. A máquina onde vou executar é um notebook (pré histórico) ThinkPad IBM com Windows 95 (v4.00.950 B) com processador Intel Pentium MMX 233MHz com 64MB RAM. Nessa máquina o programa apenas iniciava a contagem, não parava nunca. Então peguei uma outra máquina de teste, nesse caso um desktop IBM-PC 300GL com Windows 98 (v.4.10.2222 A) num processador Intel Celeron 300MHz e 64 MB RAM. Obtive o mesmo problema. A contagem era iniciada, porém quando deveria parar, não parava. Peguei outra máquina para teste, nesse caso um "Generic PC" com processador AMD Athlon MP 1.0GHz e Windows 2000 SP 4 (v.5.00.2195) e tudo funcionou normalmente. Agora vem a pergunta fatal: Devo alterar alguma coisa no programa para que ele rode nos benditos Win95/Win98? O que devo alterar? Desde já grato, Ricardo. Ricardo César Cardoso <[EMAIL PROTECTED]> escreveu: 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] __________________________________________________ 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]