Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
Вниззагрузка процессора Найти похожие ветки
← →
jonin (2009-02-01 11:33) [0]доброго времяни суток, я думаю у многих возникал вопрос по отоброжению загрузки процессора, вот и он взник у меня, дайте пожалуйста код чтобы вывести информацию о загруженности процессора в лейбл например
зарание спасибо
← →
Anatoly Podgoretsky © (2009-02-01 12:12) [1]Неправда, у меньшинства, у озабоченых, но код они должны сами писать, для этого надо изучать ВинАПИ
← →
antonn © (2009-02-01 14:07) [2]
>
> jonin (01.02.09 11:33)
http://desksoft.ru/index.php?files&id=2&owner=3 там в середине CPUUsage.zip
← →
DVM © (2009-02-01 23:14) [3]
> там в середине CPUUsage.zip
Этому примеру пора на свалку истории уже года 2 назад. Не рабочий он в современных ОС. В HKEY_PERFORMANCE_DATA запрещен доступ обычным юзерам. И через WMI тоже по тем же причинам не узнаешь.
← →
antonn © (2009-02-02 01:18) [4]А, ну да, в следующий раз буду советовать "нужно написать программу".
Другой пример покажешь? :)
← →
DVM © (2009-02-02 11:54) [5]
> antonn © (02.02.09 01:18) [4]
> А, ну да, в следующий раз буду советовать "нужно написать
> программу".
По крайней мере это будет правильный ответ.
> Другой пример покажешь? :)
unit cpusage;
interface
uses windows, messages;
const
SystemBasicInformation = 0;
SystemPerformanceInformation = 2;
SystemTimeInformation = 3;
type
TPDWord = ^DWORD;
TSystem_Basic_Information = packed record
dwUnknown1: DWORD;
uKeMaximumIncrement: ULONG;
uPageSize: ULONG;
uMmNumberOfPhysicalPages: ULONG;
uMmLowestPhysicalPage: ULONG;
uMmHighestPhysicalPage: ULONG;
uAllocationGranularity: ULONG;
pLowestUserAddress: Pointer;
pMmHighestUserAddress: Pointer;
uKeActiveProcessors: ULONG;
bKeNumberProcessors: byte;
bUnknown2: byte;
wUnknown3: word;
end;
type
TSystem_Performance_Information = packed record
liIdleTime: LARGE_INTEGER; {LARGE_INTEGER}
dwSpare: array[0..75] of DWORD;
end;
type
TSystem_Time_Information = packed record
liKeBootTime: LARGE_INTEGER;
liKeSystemTime: LARGE_INTEGER;
liExpTimeZoneBias: LARGE_INTEGER;
uCurrentTimeZoneId: ULONG;
dwReserved: DWORD;
end;
var
NtQuerySystemInformation: function(infoClass: DWORD;
buffer: Pointer;
bufSize: DWORD;
returnSize: TPDword): DWORD; stdcall = nil;
liOldIdleTime: LARGE_INTEGER = ();
liOldSystemTime: LARGE_INTEGER = ();
function GetCPUUsage: Double;
implementation
//------------------------------------------------------------------------------
function Li2Double(x: LARGE_INTEGER): Double;
begin
Result := x.HighPart * 4.294967296E9 + x.LowPart
end;
//------------------------------------------------------------------------------
function GetCPUUsage: Double;
var
SysBaseInfo: TSystem_Basic_Information;
SysPerfInfo: TSystem_Performance_Information;
SysTimeInfo: TSystem_Time_Information;
status: Longint; {long}
dbSystemTime: Double;
dbIdleTime: Double;
bLoopAborted: boolean;
begin
if @NtQuerySystemInformation = nil then
NtQuerySystemInformation := GetProcAddress(GetModuleHandle("ntdll.dll"),
"NtQuerySystemInformation");
if @NtQuerySystemInformation = nil then exit;
status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil);
if status <> 0 then exit;
status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0);
if status <> 0 then Exit;
status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil);
if status <> 0 then Exit;
liOldIdleTime := SysPerfInfo.liIdleTime;
liOldSystemTime := SysTimeInfo.liKeSystemTime;
sleep(5);
status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0);
if status <> 0 then Exit;
status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil);
if status <> 0 then Exit;
dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
dbIdleTime := dbIdleTime / dbSystemTime;
dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5;
result := dbIdleTime;
end;
//------------------------------------------------------------------------------
end.
← →
DVM © (2009-02-02 11:57) [6]В данном примере замер возможен только двумя последовательными измерениями между которыми должно пройти некоторое время.
Использовать, например, так:
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption := floattostr(GetCPuUsage);
end;
← →
Ega23 © (2009-02-02 12:23) [7]
> я думаю у многих возникал вопрос по отоброжению загрузки
> процессора
Я искренне не понимаю: нафига в клиентской программе нужно значение загрузки CPU?
← →
antonn © (2009-02-02 13:13) [8]
> Ega23 © (02.02.09 12:23) [7]
Во многих играх есть бенчмарк, меняет ФПС и нагрузку.
Как вариант :)
← →
DVM © (2009-02-02 13:36) [9]Небольшое замечание к [5]. Функция сляпана на коленке путем выдирания кусков из другого проекта. Нуждается в доработке. Во-первых, Sleep(5) это костыль, который необходимо убрать, к тому же временную задержку надо сделать больше, во-вторых, желательно проиннициализировать там некоторые переменные иначе возможен некорректный результат.
← →
DVM © (2009-02-02 13:38) [10]
> Ega23 © (02.02.09 12:23) [7]
> нафига в клиентской программе нужно значение загрузки CPU?
Редко, но бывает. Например, клиентская программа, жрущая много ресурсов, может автоматически умерить свои аппетиты, если загрузка процессора больше некоторой заданной величины.
← →
Denis__ © (2009-02-02 13:56) [11]
> Например, клиентская программа, жрущая много ресурсов,
> может автоматически умерить свои аппетиты,
Почему не сделать это сразу?
← →
clickmaker © (2009-02-02 14:00) [12]> Почему не сделать это сразу?
может, там настройка типа "не загружать ЦПУ больше ..."
← →
имя (2009-02-02 14:24) [13]Удалено модератором
← →
Сергей М. © (2009-02-02 14:27) [14]Удалено модератором
← →
KSergey © (2009-02-02 14:27) [15]Удалено модератором
← →
имя (2009-02-02 14:34) [16]Удалено модератором
← →
Anatoly Podgoretsky © (2009-02-02 14:48) [17]Удалено модератором
← →
Rouse_ © (2009-02-02 15:02) [18]Пост №13 был не от автора, просьба к участникам быть сдержаннее, а самому автору зарегистрироваться на форуме во избежании повторения таких провокаций.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.051 c