уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Достаточно интересный, с моей точки зрения, вопрос был задан не так давно на ru.stackoverflow.com — как узнать количество занимаемой приложением памяти в Delphi? Надо сказать, что вариантов решения этой задачи может быть несколько, однако здесь я рассмотрю только один — с использованием PsAPI Windows.

Тестовое приложение будет выглядеть следующим образом:

Предельно простой интерфейс — жмем кнопку «Подсчитать» и в Memo выводим всю полученную информацию. Для такого приложения Task Manager Windows показывает следующее потребление памяти:

Узнаем количество занимаемой приложением оперативной памяти в Delphi.

Используем возможности WinAPI (PsAPI) для подсчета занимаемой приложением памяти

Вариант решения предложен пользователем jocker64. Выглядит решение следующим образом:

uses .., psAPI, Windows;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  pmc: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
begin
  Memo1.Lines.Clear;
  cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
  GetMem(pmc, cb);
  pmc^.cb := cb;
  if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
  begin
    Memo1.Lines.Add( FloatToStr(pmc^.WorkingSetSize/1024) + ' KB');
    Memo1.Lines.Add( FloatToStr(pmc^.PagefileUsage/1024) + ' KB');
  end;
  FreeMem(pmc);
end;

Разберемся с тем, что представлено в этом решении. Начнем с переменной pmc.

pmc: PPROCESS_MEMORY_COUNTERS

PPROCESS_MEMORY_COUNTERS — это структура, имеющая следующие поля:

Поле Тип Описание
cb DWORD Размер структуры в байтах
PageFaultCount DWORD Ошибки страницы
PeakWorkingSetSize SIZE_T Пиковый размер рабочего набора в байтах
WorkingSetSize SIZE_T Текущий размер рабочего набора в байтах
QuotaPeakPagedPoolUsage SIZE_T Пиковое использование выгружаемого пула, в байтах
QuotaPagedPoolUsage SIZE_T Текущее использование выгружаемого пула в байтах
QuotaPeakNonPagedPoolUsage SIZE_T Пиковое использование невыгружаемого пула, в байтах
QuotaNonPagedPoolUsage SIZE_T Текущее использование невыгружаемого пула в байтах.
PagefileUsage SIZE_T Значение Commit Charge в байтах для этого процесса. Commit Charge — это общий объем памяти, выделенный диспетчером памяти для запущенного процесса
PeakPagefileUsage SIZE_T Пиковое значение в байтах Commit Charge за время существования этого процесса

Функция GetProcessMemoryInfo, соответственно, получает информацию об использовании памяти указанным процессом, а GetCurrentProcess() возвращает, как сказано на сайте Microsoft Docs, псевдо-хэндл текущего процесса.

Таким образом, в примере выше, для того, чтобы узнать в Delphi сколько памяти занимает наше приложение мы выводим в Memo текущий размер рабочего набора и общий объем памяти, выделенный диспетчером памяти для запущенного процесса, переводя при этом значения полей в килобайты.

Посмотрим, что получится в результате:

Возможно, что кто-то посчитает, что наше приложение показывает неверные значения потребления памяти, но никакой ошибки здесь нет. Просто те значения потребления памяти, которые мы получили в Delphi находятся на вкладке «Подробности»:

Таким образом, можно констатировать, что представленный выше пример определения потребления памяти приложением в Delphi позволяет получать информацию так же, как и в Диспетчере задач Windows. Единственное, что остается добавить — это проверку того, что наше приложение работает в Windows версии не ниже Windows XP. Проверить версию Windows в Delphi можно достаточно просто, используя «штатные» возможности TOSVersion.

3.7 3 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии