Главная arrow Лаборатория arrow Лаборатория кода arrow Минимизация занимаемой памяти  
06.02.2012
Главное меню
Главная
Лаборатория
Книги по дельфи
Инструменты
Статьи
Видео
Юмор
Ссылки
Поиск
База знаний Delphi
Общие вопросы
Windows, WinAPI
Графика, Звук
IDE Delphi
Консоль
Авторизация





Забыли пароль?
Вы не зарегистрированы. Регистрация
Каталог@Mail.ru - каталог ресурсов интернет
Минимизация занимаемой памяти Версия для печати
Рейтинг: / 42
ХудшаяЛучшая 
Написал Snowy   
13.02.2008
Маленький трюк, который пригодится Вам для создания приложений, работающих в фоновом режиме. Таких, как планировщик задач, служб, серверов и т.п. То есть приложений, которые постоянно сидят себе тихонько в памяти, и чего-то там в фоне делают, не мешая пользователю заниматься своими делами.
Для таких приложений важным фактором является размер потребляемой памяти.
Фоновые приложения должны кушать минимум оперативной памяти и не нагружать процессор.
В принципе, данный приём можно применять в любых приложениях. Просто для активных интерфейсных приложений в этом нет смысла.
Но меньше слов, больше кода:
uses Windows, SysUtils;
 
procedure TrimWorkingSet;
var
  MainHandle: THandle;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
    SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
    CloseHandle(MainHandle);
  end;
end;
После вызова этой процедуры, приложение отпустит всю ненужную ему память.
Можете попробовать создать пустую форму с кнопкой и посмотреть, как изменится объём занимаемой памяти.
P.S. Сработает только на WinNT системах.

Копирайты:
Code courtesy of Roy Nelson ( Этот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script ), Inprise European Professional Support
From Delphi Magazine article "Slimming the fat off your Apps" by Hallvard Vassbotn, Этот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script
Добавить новыйПоиск
VICTAR   2008-02-14 21:55:55
Здорово! :woohoo:
Igor Skomorokh   2008-02-25 11:48:21
Можно сделать и короче:
код:
if Win32Platform = VER_PLATFORM_WIN32_NT then
 
    SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);


Это тот же подход, который винда использует при сворачивании окон.
Snowy   2008-02-26 20:45:30
Можно и короче, но так читабельнее.
Да и отпускать хэндл - дело культурное. Хоть и не обязательно в данном случае, но хорогий тон.
Что касается подхода - да именно так.
Только в данном случае нам не нужно сворачивать и разворачивать. Да и без "хитростей" это не всегда пройдёт гладко.
А без окон вообще - только так.
Virilis   2008-03-24 00:30:00
Фоновые приложения должны кушать минимум оперативной памяти и не нагружать процессор.

Правильно сказано, но к приведенному примеру не имеет никакого отношения. Если программа имеет утечки памяти - ей уже ничто не поможет. А по данному примеру: скинул данные в своп - и радуешся? Гы...
Bainer   2008-05-31 03:28:46
О Спасибо! :woohoo: Как раз пригодилось
Кенес   2009-05-14 01:00:23
Я слышал что на самом деле память не освобождается, а просто в диспетчере делает вид что меньше места занимает...
Snowy   2009-05-14 23:30:45
На самом деле освобождается физическая память.
Всё ненужное просто сбрасывается в свап на жёстком диске.
Разумеется ничто и никуда не девается.
Реально программа продолжает использовать всю затребованную память по прежнему. Но физическая память действительно освобождается и становится доступной для более полезных целей.
Зачем занимать её ненужным мусором? Пусть он валяется в свопе. В 99% случаев он просто не потребуется. Если и потребуется, винда сама достанет необходимое обратно.
Olgusya   2010-03-17 19:28:04
Очень полезная информация, спасибо автору.
Meletyushka - Meletyushka   2010-03-23 16:11:07
полезно а главное вовремя
Aryusha   2010-05-04 13:53:49
А я через диспетчер закрываю некоторые задачи, но некоторые сами лезут опять, мож это поможет. Спасибо.
Алексей   2011-02-15 18:16:50
Ого :) Отличный материал спасибо, а то комп слабенький это хоть малость разгрузит его
комментарии
Имя:
Заголовок:
UBB-Код:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Security Image
Пожалуйста, введите проверочный код, который Вы видите на картинке.
 
< Пред.   След. >