Você está na página 1de 18

06/08/2019 Otimizando o uso da memória do seu programa Delphi

Ciências, Tecnologia, Matemática › Ciência da Computação

Otimizando o uso da memória do seu


programa Delphi
SHARE FLIP EMAIL

de
Zarko Gajic
Atualizado em 19 de julho de 2019

Ao escrever aplicativos de longa duração - o tipo de programa que passará a maior parte do
dia minimizado na barra de tarefas ou na bandeja do sistema , pode ser importante não
deixar o programa "fugir" com o uso da memória.

Aprenda a limpar a memória usada pelo seu programa Delphi usando a função
SetProcessWorkingSetSize da API do Windows.

01 O que o Windows pensa sobre o uso da memória do seu


de 06
programa?

https://www.thoughtco.com/design-your-delphi-program-1058488 1/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

Dê uma olhada na captura de tela do Gerenciador de Tarefas do Windows ...

As duas colunas mais à direita indicam o uso da CPU (tempo) e o uso da memória. Se um
processo impactar severamente em um deles, o sistema ficará lento.

O tipo de coisa que freqüentemente causa impacto no uso da CPU é um programa que está
em loop (pergunte a qualquer programador que tenha esquecido de colocar uma instrução
"read next" em um loop de processamento de arquivo). Esses tipos de problemas geralmente
são facilmente corrigidos.

O uso da memória, por outro lado, nem sempre é aparente e precisa ser gerenciado mais do
que corrigido. Suponha, por exemplo, que um programa de tipo de captura esteja sendo
executado.

Este programa é usado durante todo o dia, possivelmente para captura telefônica em um
help desk, ou por algum outro motivo. Simplesmente não faz sentido desligá-lo a cada vinte
https://www.thoughtco.com/design-your-delphi-program-1058488 2/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

minutos e depois reiniciá-lo. Ele será usado durante todo o dia, embora em intervalos
infrequentes.

Se esse programa se basear em algum processamento interno pesado ou tiver muitos gráficos
em seus formulários, mais cedo ou mais tarde seu uso de memória aumentará, deixando
menos memória para outros processos mais freqüentes, aumentando a atividade de
paginação e, em última análise, tornando o computador mais lento .

https://www.thoughtco.com/design-your-delphi-program-1058488 3/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

02 Quando criar formulários em seus aplicativos Delphi


de 06

Digamos que você irá criar um programa com o formulário principal e dois formulários
(modais) adicionais. Normalmente, dependendo da sua versão do Delphi, o Delphi vai
inserir os formulários na unidade de projeto (arquivo DPR) e incluirá uma linha para criar
todos os formulários na inicialização do aplicativo (Application.CreateForm (...)

As linhas incluídas na unidade de projeto são de design Delphi e são ótimas para pessoas que
não estão familiarizadas com o Delphi ou estão apenas começando a usá-lo. É conveniente e
útil. Isso também significa que TODOS os formulários serão criados quando o programa for
iniciado e NÃO quando forem necessários.
https://www.thoughtco.com/design-your-delphi-program-1058488 4/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

Dependendo do seu projeto e da funcionalidade que você implementou, um formulário pode


usar muita memória, assim os formulários (ou em geral: objetos) só devem ser criados
quando necessários e destruídos (liberados) assim que não forem mais necessários .

Se "MainForm" for a forma principal do aplicativo, ele precisará ser o único formulário
criado na inicialização no exemplo acima.

Ambos, "DialogForm" e "OccasionalForm" precisam ser removidos da lista de "Formulários


de criação automática" e movidos para a lista "Formulários disponíveis".

https://www.thoughtco.com/design-your-delphi-program-1058488 5/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

03 Corte de memória alocada: não é tão ctício quanto o


de 06
Windows faz

https://www.thoughtco.com/design-your-delphi-program-1058488 6/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

Stanislaw Pytel / Getty Images

Por favor, note que a estratégia descrita aqui é baseada na suposição de que o programa em
questão é um programa do tipo “captura” em tempo real. Pode, no entanto, ser facilmente
adaptado para processos do tipo lote.

Windows e alocação de memória


O Windows tem uma maneira bastante ineficiente de alocar memória para seus processos.
Aloca a memória em blocos significativamente grandes.

O Delphi tentou minimizar isso e tem sua própria arquitetura de gerenciamento de memória,
que usa blocos muito menores, mas isso é praticamente inútil no ambiente Windows, porque
a alocação de memória, em última instância, está no sistema operacional.

Depois que o Windows alocar um bloco de memória a um processo, e esse processo liberar
99,9% da memória, o Windows ainda perceberá que todo o bloco está em uso, mesmo se
apenas um byte do bloco estiver sendo usado. A boa notícia é que o Windows fornece um
mecanismo para limpar esse problema. O shell nos fornece uma API chamada
SetProcessWorkingSetSize . Aqui está a assinatura:

https://www.thoughtco.com/design-your-delphi-program-1058488 7/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

SetProcessWorkingSetSize ( hProcess: HANDLE;


MinimumWorkingSetSize: DWORD;
MaximumWorkingSetSize: DWORD);

https://www.thoughtco.com/design-your-delphi-program-1058488 8/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

04 A função de API AllProcessWorkingSetSize All Mighty


de 06

https://www.thoughtco.com/design-your-delphi-program-1058488 9/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

Sirijit Jongcharoenkulchai / EyeEm / Getty Images

Por definição, a função SetProcessWorkingSetSize define os tamanhos de conjunto de


trabalho mínimo e máximo para o processo especificado.

Essa API destina-se a permitir uma configuração de baixo nível dos limites mínimo e
máximo de memória para o espaço de uso de memória do processo. No entanto, tem uma
pequena peculiaridade que é a mais afortunada.

Se os valores mínimo e máximo forem definidos como $ FFFFFFFF, a API reduzirá


temporariamente o tamanho do conjunto para 0, trocando-o da memória e, assim que voltar
à RAM, ele terá a quantidade mínima de memória alocada para isso (tudo isso acontece
dentro de alguns nanossegundos, então para o usuário deve ser imperceptível).

Uma chamada para essa API só será feita em intervalos determinados - não continuamente,
portanto, não haverá impacto algum no desempenho.

Precisamos tomar cuidado com algumas coisas:

1. O identificador mencionado aqui é o identificador do processo NÃO o manipulador


de formulários principal (portanto, não podemos simplesmente usar o “Handle” ou o
“Self.Handle”).

2. Não podemos chamar essa API indiscriminadamente, precisamos tentar chamá-la


quando o programa for considerado inativo. A razão para isso é que não queremos
que a memória de corte seja retirada na hora exata em que algum processamento
https://www.thoughtco.com/design-your-delphi-program-1058488 10/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

(um clique de botão, um pressionamento de tecla, um programa de controle, etc.)


está prestes a acontecer ou está acontecendo. Se isso for permitido, corremos um
sério risco de incorrer em violações de acesso.

05 Recortando o Uso da Memória na Força


de 06

Imagens do herói / Getty Images

A função da API SetProcessWorkingSetSize destina-se a permitir a configuração de baixo


nível dos limites mínimo e máximo de memória para o espaço de uso de memória do
processo.

Aqui está uma função Delphi de exemplo que envolve a chamada para
SetProcessWorkingSetSize:

procedimento TrimAppMemorySize;
var
MainHandle: THandle;
começam
tentativa
MainHandle: = OpenProcess (PROCESS_ALL_ACCESS, falsa,
https://www.thoughtco.com/design-your-delphi-program-1058488 11/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

GetCurrentProcessID);
SetProcessWorkingSetSize (MainHandle, $ FFFFFFFF, $ FFFFFFFF);
CloseHandle (MainHandle);
exceto
final ;
Application.ProcessMessages;
fim ;

Ótimo! Agora nós temos o mecanismo para cortar o uso da memória . O único outro
obstáculo é decidir quando chamá-lo.

06 TApplicationEvents OnMessage + um temporizador: =


de 06
TrimAppMemorySize NOW

Morsa Images / Getty Images

Neste código, nós o colocamos assim:

Crie uma variável global para manter a última contagem de toques gravados NO
FORMULÁRIO PRINCIPAL. A qualquer momento em que houver atividade de teclado ou
mouse, registre a contagem de tiques.
https://www.thoughtco.com/design-your-delphi-program-1058488 12/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

Agora, verifique periodicamente a contagem do último tick contra "Now" e se a diferença


entre os dois for maior que o período considerado como um período inativo seguro, recorte a
memória.

var
LastTick: DWORD;

Solte um componente ApplicationEvents no formulário principal. Em seu manipulador de


eventos OnMessage , digite o seguinte código:

procedure TMainForm.ApplicationEvents1Message ( var Msg: tagMSG; var


Manipulado: Boolean);
início
caso Msg.message de
WM_RBUTTONDOWN,
WM_RBUTTONDBLCLK,
WM_LBUTTONDOWN,
WM_LBUTTONDBLCLK,
WM_KEYDOWN:
LastTick: = GetTickCount;
fim ;
fim ;

Agora decida qual período de tempo você considerará o programa ocioso. Decidimos por
dois minutos no meu caso, mas você pode escolher qualquer período que desejar,
dependendo das circunstâncias.

Solte um temporizador no formulário principal. Defina seu intervalo para 30000 (30
segundos) e, em seu evento "OnTimer", insira a seguinte instrução de uma linha:

procedimento TMainForm.Timer1Timer (Sender: TObject);


begin
if (((GetTickCount - LastTick) / 1000)> 120) ou (Self.WindowState =

https://www.thoughtco.com/design-your-delphi-program-1058488 13/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

wsMinimized) e depois TrimAppMemorySize;


fim ;

Adaptação para processos longos ou programas em lote


Adaptar este método para longos tempos de processamento ou processos em lote é bastante
simples. Normalmente, você terá uma boa idéia de onde um longo processo será iniciado
(por exemplo, início de um loop lendo milhões de registros de banco de dados) e onde
terminará (fim do loop de leitura do banco de dados).

Simplesmente desative seu temporizador no início do processo e ative-o novamente no final


do processo.

CITAR

Article
Uma Introdução aos Ponteiros e Seu
Uso para Iniciantes Delphi

Article
Alocação de memória pilha vs. pilha
para desenvolvedores Delphi

Article
Con gurando o parâmetro owner
para um objeto Delphi TForm
Article
Termos do glossário do Visual Basic

https://www.thoughtco.com/design-your-delphi-program-1058488 14/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

Article
Article
Construindo a seqüência de
O que é a programação Delphi? conexão de banco de dados
dinamicamente

Article Article
O que você precisa saber para evitar Aqui está como colocar aplicativos
vazamentos de memória do Delphi na bandeja do sistema
aplicativo Delphi

Article
Como descubro meu endereço IP
com o Delphi?

https://www.thoughtco.com/design-your-delphi-program-1058488 15/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

Article
Manipulando Mensagens do
Windows como o caminho Delphi

Article
Usando o TStopWatch para ver os
tempos de execução do processo no
Delphi

Article Article
Entendendo os Arquivos de Projeto Como usar um timer em macros do
do Delphi (DPR) e os Arquivos de Of ce VBA
Origem da Unidade (PAS)

Article
Sobre a programação Delphi para
desenvolvedores novatos

https://www.thoughtco.com/design-your-delphi-program-1058488 16/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

Article Article
Como usar recursos no Visual Basic Como criar, usar e fechar
6 formulários no Delphi

Aprenda algo novo todos os dias

Enter Your Email INSCREVER-SE

Siga-nos

Ciência, Tecnologia, Matemática Humanidades

línguas Recursos

Sobre nós Anunciar

Política de Privacidade Política de Cookies

Carreiras Diretrizes editoriais

Contato Termos de uso

A ThoughtCo faz parte da família de publicações Dotdash.


Família Verywell | Mente De Verywell |

https://www.thoughtco.com/design-your-delphi-program-1058488 17/18
06/08/2019 Otimizando o uso da memória do seu programa Delphi

O Equilíbrio Lifewire e mais

https://www.thoughtco.com/design-your-delphi-program-1058488 18/18

Você também pode gostar