O programa vai ficando mais lento

Delphi

18/05/2005

Pessoal, tenho um programa que conta pçs que passa
embaixo de um sensor. Cada vez que passa incrementa mais
um em um edit e faz algumas contas. O problema é que cada vez
vai ficando mais lento a captura do sinal do sensor. Se fecho o
programa e executo novamente, ele fica normal de inicio, e depois
de umas doze horas + ou - ja esta bem lento novamente. Chega
a travar o mouse, o programa. Ja ouvi falar em liberar + memoria
não sei se é por ai. E se for como se faz isso?

Abraços
juarezber@terra.com.br


Juarezber

Juarezber

Curtidas 0

Respostas

Sremulador

Sremulador

18/05/2005

você utiliza muitos forms, variaveis... ???


GOSTEI 0
Juarezber

Juarezber

18/05/2005

Caro Sremulador,
Somente dois forms abertos e dois de relatorios, quando precisa abri lo.
1 - Umas trita variaveis cada form:
2 - Cinco Timers cada form;
3 - Trinta itens atualizando em dois arquivos INI, minuto em minuto;
4 - Salvamento em duas tabelas em oito horas, com 20 campos numericos e um Alfa cada;
5 - Execução de calculos do sensor a cada pç, mais ou menos 90 vezes
a cada minuto em cada form;
6 - Fica conectado via serial 24:00 h contando pçs.

Abraços
juarezber@terra.com.br


GOSTEI 0
Renatosilva

Renatosilva

18/05/2005

Tu deve ta criando objeto e esquecendo de destruir. Posta o código.


GOSTEI 0
Rookie

Rookie

18/05/2005

Existem vários motivos para isso acontecer, vc não explicou em detalhes, mas se ,por exemplo, vc estiver usando dbexpress e não estiver dando Applyupdates regularmente isto pode causar uma lentidão no seu programa.


GOSTEI 0
Juarezber

Juarezber

18/05/2005

Rookie, podeira explicar melhor por favor!

Abraços
Juarezber


GOSTEI 0
Sremulador

Sremulador

18/05/2005

talvez a cada determinado tempo você poderia esvaziar a memória do formulário, tente dar um release no form quem sabe funcione...


GOSTEI 0
Juarezber

Juarezber

18/05/2005

Como assim...

Abraços
juarezber


GOSTEI 0
Renatosilva

Renatosilva

18/05/2005

Cara posta o código, eu continuo achando possível que tu cria objetos e não destrói. Eu já tive esse problema: o consumo de RAM vai crescendo, crescendo e era esse o motivo.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/05/2005

também pode ser os timer´s ´encavalando´ processos.

ao inciar um timer, desative-o e ative novamente depois de terminar o processo.

algo como:
procedure TForm1.Timer1OnTimer(Sender: TObject);
begin
  // desativa o timer para evitar que os processos ´encavalem´
  // caso o tempo de processamento seja maior que o tempo do timer
  Timer1.Enabled := False;

  {aqui acontece o processo}

  // ativa novamente o timer
  Timer1.Enabled := True;
end;



GOSTEI 0
Luizf2

Luizf2

18/05/2005

Juarez,

O tamanho do programa na memória está aumentando, ou é só a velocidade de processamento que diminui?

Luiz Fernando


GOSTEI 0
Juarezber

Juarezber

18/05/2005

Luiz, é o processamento que vai ficando mais lento.

Abraços
Juarezber


GOSTEI 0
Juarezber

Juarezber

18/05/2005

Renato, desculpe a minha iguinorancia, mas eu não sei o que é
postar o codigo, que tu falas. Pode me dar um toque?

Abraços
Juarezber


GOSTEI 0
Rjun

Rjun

18/05/2005

Ele quer que você coloque o trecho do código onde você cria os compontes e onde você os destroi.


GOSTEI 0
Renatosilva

Renatosilva

18/05/2005

Postar o codigo eh colocar aqui o seu codigo pra gente analisar, como o Rjun falou.

Tem certeza que o consumo de memória não aumenta? Se é o processamento apenas que fica mais lento, reforço o pedido: posta o código :)


GOSTEI 0
Luizf2

Luizf2

18/05/2005

Juarez,

Já ficou claro que o programa fica mais lento com o passar do tempo, mas é importante saber se ele tem este comportamento em função do aumento de memória.

A lentidão pode ser conseqüência do aumento de memória.

Rode o programa, vá para o Task Manager (Gerenciador de Tarefas), na aba de Processes (Processos), localize o seu processo pelo nome e fique observando se ele vai aumentando de memória, ou se é só consumo de processamento.

Luiz Fernando


GOSTEI 0
Juarezber

Juarezber

18/05/2005

La vai o codigo amigos.

// Incremente + um
procedure TFormContador2.TimerIndrementaTimer(Sender: TObject);
Var
A, B, C, AA, BB, CC: Integer;
S1, S2: Real;
begin
//if bComOpen then
//ShowMessage(´A porta não esta aberta´);
//Close_Com( gcPort );
//Close;
//Sensor 1
S1:= StrToFloat(EditSaidaSecador2.Text);
B:= StrToInt(IntToStr(gw7000[5]));
Edit992.Text:= IntToStr(B);
A:= ($00010);
Edit9992.Text:= IntToStr(A);
C:= (B) and (A);
Edit99992.Text:= IntToStr(C);
Gauge1.BackColor:= clWhite;
if (C = 0) then
begin
if (W = 0) then
begin
W:= 1;
EditSaidaSecador2.Text:= FloatToStr(S1 + 1);
Gauge1.BackColor:= clRed;
end;
end
else
W:= 0;
//Sensor 2
S2:= StrToFloat(EditEntradaForno2.Text);
BB:= StrToInt(IntToStr(gw7000[5]));
AA:= ($00020);
CC:= (BB) and (AA);
Gauge2.BackColor:= clWhite;
if (CC = 0) then
begin
if (WW = 0) then
begin
WW:= 1;
EditEntradaForno2.Text:= FloatToStr(S2 + 1);
Gauge2.BackColor:= clRed;
//Sleep(1000);
end;
end
else
WW:= 0;
end;


// calculos
procedure TFormContador2.Timer3Timer(Sender: TObject);
Var
S1, QS1, TSS1, E1, QE1, T1, TEF1, PQ: Real;
begin
S1:= StrToFloat(EditSaidaSecador2.Text);
QS1:= StrToFloat(EditQuantPcSaidaSecador1.Text);
TSS1:= StrToFloat(EditTotalSaidasecador2.Text);
EditTotalSaidasecador2.Text:= FloatToStr(S1*QS1);

E1:= StrToFloat(EditEnTradaForno2.Text);
QE1:= StrToFloat(EditQuantPcEntradaForno1.Text);
TEF1:= StrToFloat(EditTotalEntradaForno2.Text);
EditTotalEntradaForno2.Text:= FloatToStr(E1*QE1);

T1:= StrToFloat(EditTotalPcQuebra2.Text);
EditTotalPcQuebra2.Text:= FloatToStr((TSS1)-(TEF1));

EditPercentualEficiencia2.Text:= FormatFloat(´00.00´,
(TEF1/TSS1)*100);

PQ:= StrToFloat(EditPercentualEficiencia2.Text);
EditQuebra2.Text:= FormatFloat(´00.00´,100-PQ);
end;



Abraços
Juarezber


GOSTEI 0
Juarezber

Juarezber

18/05/2005

Luiz, pelo que eu percebi, no caminho que tu falou,
a memoria não aumenta da tamanho.

Grato
Juarezber


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/05/2005

qual é o tempo dos timers? um timer é dependente do outro?

eu ainda acho que os processos estão ´encavalados´.

tente assim:

procedure TFormContador2.TimerIndrementaTimer(Sender: TObject);
var
  A, B, C, AA, BB, CC: Integer;
  S1, S2: Real;
begin
  // desliga o timer, impedindo que os processos fiquem ´encavalados´
  TimerIndrementa.Enabled := False;

  //if bComOpen then
  //ShowMessage(´A porta não esta aberta´);
  //Close_Com( gcPort );
  //Close;

  //Sensor 1
  S1:= StrToFloat(EditSaidaSecador2.Text);
  B:= StrToInt(IntToStr(gw7000[5]));
  Edit992.Text:= IntToStr(B);
  A:= ($00010);
  Edit9992.Text:= IntToStr(A);
  C:= (B) and (A);
  Edit99992.Text:= IntToStr(C);
  Gauge1.BackColor:= clWhite;

  if (C = 0) then
  begin
    if (W = 0) then
    begin
      W:= 1;
      EditSaidaSecador2.Text:= FloatToStr(S1 + 1);
      Gauge1.BackColor:= clRed;
    end;
  end
  else
    W:= 0;

  //Sensor 2
  S2:= StrToFloat(EditEntradaForno2.Text);
  BB:= StrToInt(IntToStr(gw7000[5]));
  AA:= ($00020);
  CC:= (BB) and (AA);
  Gauge2.BackColor:= clWhite;
  if (CC = 0) then
  begin
    if (WW = 0) then
    begin
      WW:= 1;
      EditEntradaForno2.Text:= FloatToStr(S2 + 1);
      Gauge2.BackColor:= clRed;
      //Sleep(1000);
    end;
  end
  else
    WW:= 0;

  // religa o timer
  TimerIndrementa.Enabled := True;
end;



GOSTEI 0
Juarezber

Juarezber

18/05/2005

Emerson, Os timers são independentes.
500 ms cada. Não estou entendendo, se eu desligo o
timer no começo do codigo, como vai ser a execução?

Abraços
Juarezber


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/05/2005

no fim do código o timer está sendo religado.

o que eu acho que pode estar acontecendo é que o processo dentro do timer leva mais que 500ms então, antes de sair de um processo, já entra no outro...

o que é feito:
desliga-se o timer. faz o processo necessário. religa o timer para um novo processo.

dessa forma, o tempo do timer pode até ser inferior a 500 ms, pois assim o bloco fica protegido, não havendo sobrecarga de processos.


GOSTEI 0
POSTAR