Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Aprendiz7

[Resolvido] Programa acumlando mémoria (Timage, Tlabel, Timer)

Recommended Posts

Saudação,

Bom Pessoal eu sou novo aqui, e estes dias comecei a fazer um programa que exibe imagens da tela, coloquei uma função, e um timer de um milésimo, e coloquei como referencia para as imagens as coordenadas do mouse, fica igual a lente do sistema operacional. Mas a memória RAM só vai acumulando até o pc desligar; Eu acho que estas imagens estão sendo guardas na memória, mas eu queria só a ultima imagem, o ultimo x,y do mouse. Vou deixar o código todo aqui para que vocês analisem, a memória vai acumulando gradativamente; Ou isso é normal mesmo, ela estabiliza? tem vários comandos para limpar a memória mas não parece dar certo. Desde ja agradeço a todos.

 

(Timage e um Tlabel para as coordenadas do mouse, Ttimer(1) )

 

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   Image1: TImage;
   Label1: TLabel;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
  dc:hdc;
  cv:TCanvas;
  ordX,ordY: integer;
  psat: TPoint;implementation

{$R *.dfm}


function CapturaTela: TBitmap;
Begin
result:=TBitmap.Create;
result.Width:= 300;
result.height:=300;
dc:=getdc(0);
cv:=Tcanvas.create;
cv.handle:=dc;
result.canvas.copyrect(rect(0,0,screen.width,screen.height),cv,rect(ordX,ordY,screen.width,screen.height));
cv.free;
releasedc(0,dc);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
x:integer;
begin
 GetCursorPos(psat); // Pega a posição atual do mouse;
 //Mostra os valores das coordenadas do mouse
 label1.caption := IntToStr(psat.x) + ',' + IntToStr(psat.y);

ordX:= psat.x;
ordY:= psat.y;

image1.picture.assign(CapturaTela);

end;

end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual valor você passou para o TTimer.Interval?

 

O intervalo foi de 1 milionésimo segundo, la esta por padrão 1000 (1 segundo) eu deixei com 1 ao invés de 1000 para que as imagens atualizassem melhor, acho que este tempo de aumentado para uns 100.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que o valor entre 30 e 60 terá um bom desempenho e talvez não gere o problema, por favor, teste...

 

Desculpe a demora!! Não melhorou em nada, só esta demorando para a memória subir. será que tem um outro código alternativo para fazer isso? Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parou o aumento no consumo de memória:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   Image1: TImage;
   Label1: TLabel;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
   Procedure CapturaTela(Surface : TBitMap);
 public
   { Public declarations }
 end;

var
 Form1     : TForm1;
 psat      : TPoint;
 ordX,ordY : integer;

implementation

{$R *.dfm}

Procedure TForm1.CapturaTela(Surface : TBitMap);
var
 dc        : hdc;
 cv        : TCanvas;
 Buffer    : TBitMap;
Begin
 Buffer        := TBitmap.Create;
 Buffer.Width  := 300;
 Buffer.height := 300;
 dc            := getdc(0);
 cv            := TCanvas.Create;
 cv.handle     := dc;

 Buffer.Canvas.CopyRect( rect(0,0,screen.width,screen.height),
                         cv,
                         rect(ordX,ordY,screen.width,screen.height));

 Surface.Assign(Buffer);
 Buffer.Free;

 cv.free;
 releasedc(0,dc);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 X : Integer;
begin
 // Pega a posição atual do mouse;
 GetCursorPos(psat);
 //Mostra os valores das coordenadas do mouse
 label1.caption := IntToStr(psat.x) + ',' + IntToStr(psat.y);

 ordX := psat.x;
 ordY := psat.y;

 CapturaTela(Image1.Picture.Bitmap);

end;

end.

 

O problema era que sua rotina CapturaTela instanciava o Result como TBitmap mas não fazia o Free do mesmo, ou seja, não liberava a memória, como você chamava a rotina a cada 1 milésimo de segundo, em 1 segundo você tinha na memória 1000 objetos do tipo TBitmap sem uso. Quando eu sugeri aumentar o valor do timer para 33, esperava que existisse alguma GarbageCollector ou alguma entidade divina que limpasse a memória automaticamente para você, bobeira minha.

 

Minha alteração consistiu basicamente em parar de usar o Result e usar parametros de função, assim, eu posso liberar a memória usada dentro da própria rotina.

 

Outra dica: Como o monitor tem uma taxa de atualização entre 55 e 80 quadros por segundo, colocar 1 para o timer irá gerar uso desnecessário de CPU e capturas não utilizadas, uma vez que o monitor aproveitará 1 imagem a cada 60 (dentro da taxa do monitor). O olho humano consegue capturar naturalmente 30 quadros por segundo, portando 1000 / 30 = 33,3 ==> 33 . 33 Para o timer será o suficiente para desenhar com eficiencia na tela sem desperdiçar quadros

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu amigo desculpas a demora!! Eu ainda nem testei, mas ja tenho certeza que deu certo!! Ainda estou aprendendo o delphi. E programação não é uma coisa que se aprende sozinho. Muito Obrigado mesmo!! desculpe a demora, eu sei como é ajudar uma pessoa e ela nem volta para agradecer, isso é a pior coisa, além disso foi só você, precisava muito disso disso, tudo que vier é lucro, enfim Valeu mesmo, desculpas mesmos. Aqui vocês estão de Parabéns pois tem forum que demoram uma eternidade para você ler não sei...

 

Deus te abençoe amigo!!! Um forte abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

quando testar, volte aqui para dizer se resolveu,

 

abs...

 

Amigo fantástico!! A memória ficou estacionada. Muito Obrigado! Esta aplicação vai ficar guarda por um longo tempo.. sempre que se trabalha com imagens acontece isso. De qualquer forma isso vai ajudar muitas pessoas em qualquer aplicação que seja necessário este recurso. Muito Obrigado, conto contigo da próxima vez. Bdexterholland você esta de Parabéns.

Até mais! Deus te abençoe!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.