O programa vai ficando mais lento
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
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
Curtidas 0
Respostas
Sremulador
18/05/2005
você utiliza muitos forms, variaveis... ???
GOSTEI 0
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
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
18/05/2005
Tu deve ta criando objeto e esquecendo de destruir. Posta o código.
GOSTEI 0
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
18/05/2005
Rookie, podeira explicar melhor por favor!
Abraços
Juarezber
Abraços
Juarezber
GOSTEI 0
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
18/05/2005
Como assim...
Abraços
juarezber
Abraços
juarezber
GOSTEI 0
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
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:
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
18/05/2005
Juarez,
O tamanho do programa na memória está aumentando, ou é só a velocidade de processamento que diminui?
Luiz Fernando
O tamanho do programa na memória está aumentando, ou é só a velocidade de processamento que diminui?
Luiz Fernando
GOSTEI 0
Juarezber
18/05/2005
Luiz, é o processamento que vai ficando mais lento.
Abraços
Juarezber
Abraços
Juarezber
GOSTEI 0
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
postar o codigo, que tu falas. Pode me dar um toque?
Abraços
Juarezber
GOSTEI 0
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
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 :)
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
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
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
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
// 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
18/05/2005
Luiz, pelo que eu percebi, no caminho que tu falou,
a memoria não aumenta da tamanho.
Grato
Juarezber
a memoria não aumenta da tamanho.
Grato
Juarezber
GOSTEI 0
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:
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
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
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
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.
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