Delphi - приложение свое.

V.I.R.U.S.

Турист
Можно ли программно узнать сколько именно моя программа занимает памяти и на сколько % грузит проц! Повторяю, в программе требуется отобразить сколько она кушает ресурсов!

Если можно, то как? Я знаю только как узнать сколько всего памяти и сколько выделено и на сколько вообще проц загружен! Спасибо.
 

Vornic

Турист
Можно узнать через ф-ю NtQuerySystemInformation - её юзает и стандарнтый Task Manager и Process Explorer от SysInternals.
 

JCDenton

Турист
С загрузкой проца всё просто: если твой код выполняется (а если ты запрашиваешь инфу и показываешь её, то он, определённо, выполняется), то загрузка одно ядра процессора - 100%. И, наоборот, если твой код не выполняется, то его загрузка (тобой) = 0%.

Значения между 0 и 100 получатся только если определить соотношение времени, потраченного на тебя, к общему времени. Сделать это можно через GetProcessTimes. Сделали замер, подождали, скажем, секунду. Сделали второй замер. Вычли из второго первое и поделили на интервал (секунду). Помножили на 100. Получили "загрузку ядра в процентах".

Добавлено через 6 минут
С памятью всё сложнее. "сколько всего памяти и сколько выделено" - понятие расплывчатое.

Это сколько оперативки жрёт программа? Но это не учитывает выгруженную на диск (в SWAP) память, а ведь её мог выделить твой код. Зато учитывает кэш и прочий "не твой" код.

Это сколько памяти выделено в адресном пространстве? Но это не учтёт память, выделенную вне пространства (AWE и проецируемая память) и дважды посчитает разделяемую память. А также учтёт все системные DLL и прочий "не твой" код.

Это сколько памяти выдели через менеджер памяти Delphi? Но это включает код RTL/VCL и не учитывает выделения системного кода, а также сторонних DLL (если только не используется разделяемый менеджер или пакеты).

Короче, сам чёрт ногу сломит.
 
Last edited by a moderator:

StrikerLoner

Турист
ниже приведен фрагмент кода для получения данных о памяти используемой процессом

PROCESS_MEMORY_COUNTERS_EX = packed record
cb: DWORD;
PageFaultCount: DWORD;
PeakWorkingSetSize: DWORD;
WorkingSetSize: DWORD;
QuotaPeakPagedPoolUsage: DWORD;
QuotaPagedPoolUsage: DWORD;
QuotaPeakNonPagedPoolUsage: DWORD;
QuotaNonPagedPoolUsage: DWORD;
PagefileUsage: DWORD;
PeakPagefileUsage: DWORD;
PrivateUsage: DWORD;
end;
PPROCESS_MEMORY_COUNTERS_EX = ^PROCESS_MEMORY_COUNTERS_EX;

function GetMemoryUsage: PROCESS_MEMORY_COUNTERS_EX;
var
mc: PROCESS_MEMORY_COUNTERS_EX;
pmc: PPROCESS_MEMORY_COUNTERS;
cb: Cardinal;
begin
pmc := @mc;
cb := SizeOf(mc);
if GetProcessMemoryInfo(GetCurrentProcess, pmc, cb) then begin
Result := mc;
end;
end;
 

kindghost

Турист
в Delphi есть свой MеmoryManager (FastMM) - он все умеет и считает сам.
В WinAPI тут углубляться не нужно
 
Top