• 0
Sign in to follow this  
Guest Fernando

(Resolvido) Out of Memory Delphi

Question

Guest Fernando

Solução para Out Of Memory

Pessoal,

Junto com outros colaboradores achamos a solução do Out of Memory no Delphi 6.

Obs: Não cheguamos a testar em outras versões do Delphi, mas acreditamos que resolva o problema tb.

O projeto que tinhamos este problema estava com mais de 35 MB...

Sempre que iriamos compilar o projeto era necessário compilar um novo projeto ou limpar .dcu's, etc...Mesmo assim a cada dia a situação estava ficando mais critica...

Para maiores informações referente a solução envie-me um e-mail.

[email protected]

Share this post


Link to post
Share on other sites

14 answers to this question

Recommended Posts

  • 0
Para maiores informações referente a solução envie-me um e-mail.

Já que você não colocou a solução aqui, acho que deveria lhe perguntar se você estaria vendendo a solução. Se for o caso, informe, pois neste caso seria mais apropriado colocar este tópico na seção Classificados. ;)

Abraços

Share this post


Link to post
Share on other sites
  • 0
Guest Fernando

Ola Micheus,

Descrevi no lugar errado...

Vou documentar nos classificados, ok.

vlw :rolleyes:

Share this post


Link to post
Share on other sites
  • 0
Guest donisete

Quando precisei este era o primeiro link na busca do google. Apesar do 'amigo acima não poder nos dar a resposta acabei encontrando a solução para o problema lendo o help do delphi:

1) Clique na Query e pressione F11

2) Na propriedade BufferChunks diminua o valor de (1000) para (100)

3) Compile e bom trabalho

Donisiqueira

Share this post


Link to post
Share on other sites
  • 0

Opa

Maravilha :D

nunca passei por isso mas espero que ajude aos que estao passando...

abraçs

Share this post


Link to post
Share on other sites
  • 0

Ola Sr(s),

Para resolver o problema de Out of Memory no Delphi precisa trocar o arquivo "RLINK32.dll" que se encontra na pasta C:\Arquivos de programas\Borland\Delphi7\Bin por uma versão mais atualizada desta mesma DLL.

Obs: Esta solução foi testada e funciona para Delphi 6.

Share this post


Link to post
Share on other sites
  • 0

ERRO "out of memory" costuma dar quando:

1 - o programa cria automaticamente muitos forms e não tem memoria disponivel suficiente para mante-los

2 - ou quando voce cria os forms em tempo de execução mas não limpa a memoria quando finaliza o form

Exemplo de criação / destruição correta de formulários e liberar memória

procedure TFrmMain.Cadastro1Click(Sender: TObject); 
begin 
  Application.CreateForm(TFrmCadastro, FrmCadastro); // cria o form
  FrmCadastro.ShowModal; 
  FreeAndNil(FrmCadastro); // libera o form da memoria 
end;

Um teste bem simples de verificar isso é criando um form atraves de um botão e fechando o mesmo sem liberar a memoria ..... o resultado voce pode perceber ao usar o gerenciador de processos do windows, a quantidade de memoria usada só vai aumentando até que ocorre o erro

3 - ou quando a memoria virutal do arquivo de paginação do windows esta com um valor baixo

Soluções possiveis:

1 - Se o seu programa é muito grande voce pode fragmentá-lo em partes menores usando um sistema de modularização

http://www.techtips.com.br/programacao/mod...single-package/

2 - alterar o arquivo de paginação do windows desde que voce possua no micro memoria suficiente para isso

http://www.winajuda.com/2006/05/04/arquivo...emoria-virtual/

abraço

Share this post


Link to post
Share on other sites
  • 0
ERRO "out of memory" costuma dar quando:

1 - o programa cria automaticamente muitos forms e não tem memoria disponivel suficiente para mante-los

2 - ou quando voce cria os forms em tempo de execução mas não limpa a memoria quando finaliza o form

Exemplo de criação / destruição correta de formulários e liberar memória

procedure TFrmMain.Cadastro1Click(Sender: TObject); 
begin 
  Application.CreateForm(TFrmCadastro, FrmCadastro); // cria o form
  FrmCadastro.ShowModal; 
  FreeAndNil(FrmCadastro); // libera o form da memoria 
end;

Um teste bem simples de verificar isso é criando um form atraves de um botão e fechando o mesmo sem liberar a memoria ..... o resultado voce pode perceber ao usar o gerenciador de processos do windows, a quantidade de memoria usada só vai aumentando até que ocorre o erro

3 - ou quando a memoria virutal do arquivo de paginação do windows esta com um valor baixo

Soluções possiveis:

1 - Se o seu programa é muito grande voce pode fragmentá-lo em partes menores usando um sistema de modularização

http://www.techtips.com.br/programacao/mod...single-package/

2 - alterar o arquivo de paginação do windows desde que voce possua no micro memoria suficiente para isso

http://www.winajuda.com/2006/05/04/arquivo...emoria-virtual/

abraço

Usa desta forma para chamar os formalarios:

Application.CreateForm(TFCadColeta, FCadColeta);

QControle.Close;

QControle.ParamByName('CodUsu').AsInteger:= StrToInt(FPrincipal.Label1.Caption);

QControle.ParamByName('MENU').AsInteger := FPrincipal.GerarColeta1.Tag;

QControle.Open;

if QControleUSU_FLAG3.AsString = 'ON' then FCadColeta.BtExcluir.Visible:= true else FCadColeta.BtExcluir.Visible:= False;

if QControleUSU_FLAG2.AsString = 'ON' then vALT:= true else vALT:= False;

if QControleUSU_FLAG1.AsString = 'ON' then FCadColeta.BtInserir.Visible:= true else FCadColeta.BtInserir.Visible:= False;

FCadColeta.ShowModal;

FCadColeta.free;

E O Sistema é um pouco grande.

- Já aumentei também a quantidade de memoria de 744 para 1400 e nada ainda, como vejo em detalhes como modularizar um aplicação usando o Delphi 7.

Share this post


Link to post
Share on other sites
  • 0

Usa desta forma para chamar os formalarios:

Application.CreateForm(TFCadColeta, FCadColeta);
QControle.Close;
QControle.ParamByName('CodUsu').AsInteger:= StrToInt(FPrincipal.Label1.Caption);
QControle.ParamByName('MENU').AsInteger := FPrincipal.GerarColeta1.Tag;
QControle.Open;
if QControleUSU_FLAG3.AsString = 'ON' then FCadColeta.BtExcluir.Visible:= true else FCadColeta.BtExcluir.Visible:= False;
if QControleUSU_FLAG2.AsString = 'ON' then vALT:= true else vALT:= False;
if QControleUSU_FLAG1.AsString = 'ON' then FCadColeta.BtInserir.Visible:= true else FCadColeta.BtInserir.Visible:= False;
FCadColeta.ShowModal;
FCadColeta.free;
Eu uso essa maneira para chamar um form, dessa maneira os outros comandos necessarios estarão dentro do form
procedure TFMenu.Fornecedores1Click(Sender: TObject);
begin
  try
     if FCadFornec = Nil then
        FCadFornec := TFCadFornec.Create(self);
  except
      ShowMessage('Erro na criação do formulário !!');
      exit;
  end;

  FCadFornec.showmodal;
  FreeAndNil(FCadFornec); 
end;

como vejo em detalhes como modularizar um aplicação usando o Delphi 7.

No Pascal e em outras linguagens estruturadas existe a possibilidade de agrupar trechos de

programas em procedimentos e funções. Esta técnica de decomposição em unidades

funcionais, proveniente da programação estruturada, é conhecida como modularização.

Veja esses links ... tem muito material a respeito de modularização de aplicativos

http://www.activedelphi.com.br/print.php?sid=499

http://pjtsalina.codigolivre.org.br/pr/clu...hi/package.html

http://imasters.uol.com.br/artigo/1047/del...es_parte_final/

http://www.ramosdainformatica.com.br/art_r...s01.php?CDA=638

http://cc.embarcadero.com/Item/25208

http://www.logicatreinamentos.com.br/Modularizar.asp

http://docs.google.com/gview?a=v&q=cac...pt-BR&gl=br

http://pjtsalina.codigolivre.org.br/pr/clu...i/package2.html

http://www.portaldaprogramacao.com/artigos2.asp?n=882

OBS: Não tenha pressa... leia com calma para poder enteder a lógica do negócio

abraço

Share this post


Link to post
Share on other sites
  • 0

Olá pessoal

Sei que esse Post é meio antigo, mas estou enfrentando alguns problemas com "out of memory" no Delphi 7

Utilizo Delphi 7 com Firebird 2.5.3

O que ocorre é que aleatóriamente, quando faz um Select numa tabela (não é sempre na mesma tabela) ocorre o erro de "Out Of Memory"

Essa sugestão de dimunir o valor da propriedade  BufferChunks  da IbQuery de 1000 para 100 serveria para resolver esse probelmas ?  ou o Out of memory que se refere esse post é sobre outra coisa ?

 

Share this post


Link to post
Share on other sites
  • 0

voce pode tentar isso na sua aplicação e ver o resultado.

entretanto como voce reportou que o erro ocorre quando voce faz uma select, pode ser que voce esteja usando muitos indices em sua tabela, e dependendo da quantidade de registros que voce quer trazer da consulta, pode ocorrer esse tipo de erro.

mostre a select que voce esta usando

Share this post


Link to post
Share on other sites
  • 0
14 horas atrás, Jhonas disse:

voce pode tentar isso na sua aplicação e ver o resultado.

entretanto como voce reportou que o erro ocorre quando voce faz uma select, pode ser que voce esteja usando muitos indices em sua tabela, e dependendo da quantidade de registros que voce quer trazer da consulta, pode ocorrer esse tipo de erro.

mostre a select que voce esta usando

Bom dia.

O problema não ocorre sempre no mesmo Select ou mesma tabela.. Ocorre aleatóriamente. 

Notei que a quantidade de memória alocada pelo processo no gerenciador de tarefas do windows vai crescendo assustadoramente conforme os selects vão sendo feitos. Chega num ponto (em torno de 53 Mb) em que o próximo Select a ser feito retorna o erro de "out of memory"

Encontrei uma função na Internet chamada TrimAppMemory que reduz essa quantidade de memória que o aplicativo fica usando, porém cada vez que a executa reduz para um número maior.. Ex:  começa com 5 mb, conforme vai usando, sobe para 20 mb, ai executa a função volta para 3 mb, ai vai usando, sobre para 30, ai executa volta para 4. etc..

Ainda vai chegar num ponto que vai estourar..

Mais alguém já passou por isso ?  Será que tem solução ?

 

Share this post


Link to post
Share on other sites
  • 0

ok... vou te dar a solução

coloque um componente Timer no seu Form de Menu ... deixe a Propriedade Enabled = true e a propriedade Interval =  1000

---------------------------------------------------------------------------

No evento OnTimer 

procedure TFMenu.Timer1Timer(Sender: TObject);
begin
   limpa_memoria;
end;

--------------------------------------------------------------------------

e coloque essa procedure limpa_memoria tambem no Form Menu

procedure limpa_memoria;
var  MainHandle : THandle;
begin
   try
      MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID) ;
      SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF) ;
      CloseHandle(MainHandle) ;
   except
   end;
   Application.ProcessMessages;
end;

------------------------------------------------------------------------

OBS: a cada segundo essa procedure vai limpar a memoria , deixando o seu programa

rodar na faixa de mais ou menos 1300 kb

abraço

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this