Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.5 MB
Время: 0.04 c
2-1233776721
trsteep
2009-02-04 22:45
2009.03.29
XML vs TreeView


15-1232916784
Piter
2009-01-25 23:53
2009.03.29
Miranda IM: моя сборка (Mirapit)


3-1217477242
ЮЮ
2008-07-31 08:07
2009.03.29
ODBC DND в Win2000 с MS SQL Express


1-1208685519
Kolan
2008-04-20 13:58
2009.03.29
Сложный кросс таб отчет. Варианты реализации.


15-1232440471
Рыбба
2009-01-20 11:34
2009.03.29
Вопрос про наследование форм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский