Достаточно интересный, с моей точки зрения, вопрос был задан не так давно на 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.