Se tivermos uma aplicação que precisa ficar rodando o dia inteiro para captura de algo, como por exemplo arquivos vindo de outras aplicações para processamento dentro de nossa aplicação.
Dependendo da aplicação não temos como saber a periodicidade com que chegaram os arquivos, então temos que estar lendo o repositório frequentemente e como não sabemos a periodicidade não faz sentido para a aplicação ficarmos fechando e abrindo a aplicação conforme ela for ficando lenta.
O Windows tem um modo bastante ineficiente de alocação de memória para seus processos. Reservando a memória em grandes blocos de forma significativa.
Delphi tem tentado minimizar este e tem sua própria arquitetura de gerenciamento de memória que utiliza blocos muito menores, mas isso é praticamente inútil no ambiente do Windows, porque a alocação de memória, em última análise recai sobre o sistema operacional.
Assim que o Windows atribuiu um bloco de memória para um processo, e esse processo libera 99,9% da memória, o Windows ainda vai reservar todo o bloco para estar em uso, mesmo que apenas um byte do bloco está realmente sendo usado. O shell nos fornece uma API chamada SetProcessWorkingSetSize. Aqui está a assinatura:
SetProcessWorkingSetSize( HProcess: HANDLE; MinimunWorkingSetSize : DWord; MaximumWorkingSetSize: DWord);
A função que utilizei na minha aplicação foi a seguinte:
procedure LimparMemoria;
var
MainHandle: THandle;
begin
try
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessID);
SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF);
CloseHandle(MainHandle);
except
end;
Application.ProcessMessages;
end;
Pense em como sua aplicação funciona e adapte a função para o melhor funcionamento
Nenhum comentário:
Postar um comentário