Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Out of Memory Delphi


Guest Fernando

Pergunta

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.

piccini.fernando@gmail.com

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros 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.

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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.

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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 ?

 

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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 ?

 

Link para o comentário
Compartilhar em outros 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

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...