Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.29;
Скачать: CL | DM;

Вниз

загрузка процессора   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
15-1232283018
saNat
2009-01-18 15:50
2009.03.29
Нет доступа к сетевым папкам


15-1233142456
XeON
2009-01-28 14:34
2009.03.29
Обрезка изображения


15-1232646153
AlexDan
2009-01-22 20:42
2009.03.29
Простые числа и пятница.


4-1207330446
Riply
2008-04-04 21:34
2009.03.29
NtReadFile NtFsControlFile. Разница возвращаемых данных.


15-1233046748
Правильный$Вася
2009-01-27 11:59
2009.03.29
Opera 9.63 задваивает открываемые страницы