|
Вопрос # 696/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты!Как узнать какая сейчас загрузка ЦП у процессора и отобразить это в gauge?
 |
Вопрос задал: Аксион (статус: 4-ый класс)
Вопрос отправлен: 3 июля 2007, 18:16
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, ММО!
Как это странно не звучит - прочитать с реестра:)
вот например так, как в приложении.
Приложение: Переключить в обычный режим- uses Registry;
- .....
- procedure TForm1.Timer1Timer(Sender: TObject);
- var
- reg: TRegistry;
- B: array[1..4] of integer;
- begin
- reg := TRegistry.Create;
- reg.RootKey := HKEY_DYN_DATA;
- if reg.OpenKey('PerfStatsStatData', false) then
- reg.ReadBinaryData('KERNELCPUusage', b, 4);
- reg.CloseKey;
- Gauge1.Progress := b[1];
- end;
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 3 июля 2007, 18:39
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: Dron
Здравствуйте, ММО!
В приложении код, получающий информацию не только о загрузке процессора, но и о самом процессоре. Ненужное, конечно, можно (и даже желательно) удалить. Для работы на Form1 должен быть размещён Label1. А в любом месте программы (например, при нажатии на кнопку) нужно вызвать функцию: GetCPUUsage; Вначале появится окно с информацией о процессоре (чтобы убрать это окно нужно удалить строку ShowMessage(...) в процедуре), а затем в Label1 будет показываться уровень загрузки процессора (в процентах). Вызвать функцию достаточно один раз - она сама вызывает себя снова каждую секунду. Ассоциировать счётчик с TGauge можно так:
Form1.Gauge1.Progress:=Round(dbIdleTime);
Это следует написать вместо строки Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %',dbIdleTime);
Приложение: Переключить в обычный режим- 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 Li2Double(x: LARGE_INTEGER): Double;
- begin
- Result := x.HighPart * 4.294967296E9 + x.LowPart
- end;
-
- procedure GetCPUUsage;
- 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');
-
- // get number of processors in the system
-
- status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo),
nil);
- if status <> 0 then Exit;
-
- // Show some information
- with SysBaseInfo do
- begin
- ShowMessage(
- Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13+
- 'uMmNumberOfPhysicalPages: %d'+#13+'uMmLowestPhysicalPage: %d'+#13+
- 'uMmHighestPhysicalPage: %d'+#13+'uAllocationGranularity: %d'#13+
- 'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d',
- [uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages,
- uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity,
- uKeActiveProcessors, bKeNumberProcessors]));
- end;
-
-
- bLoopAborted := False;
-
- while not bLoopAborted do
- begin
-
- // get new system time
- status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0);
- if status <> 0 then Exit;
-
- // get new CPU's idle time
- status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo,
SizeOf(SysPerfInfo), nil);
- if status <> 0 then Exit;
-
- // if it's a first call - skip it
- if (liOldIdleTime.QuadPart <> 0) then
- begin
-
- // CurrentValue = NewValue - OldValue
- dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
- dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
-
- // CurrentCpuIdle = IdleTime / SystemTime
- dbIdleTime := dbIdleTime / dbSystemTime;
-
- // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
- dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5;
-
- // Show Percentage
- Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %',dbIdleTime);
-
- Application.ProcessMessages;
-
- // Abort if user pressed ESC or Application is terminated
- bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated;
-
- end;
-
- // store new CPU's idle and system time
- liOldIdleTime := SysPerfInfo.liIdleTime;
- liOldSystemTime := SysTimeInfo.liKeSystemTime;
-
- // wait one second
- Sleep(1000);
- end;
- end;
 |
Ответ отправил: Dron (статус: Студент)
Время отправки: 3 июля 2007, 19:34
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 29; последнее сообщение — 4 июля 2007, 20:20; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
Dron (статус: Студент), 3 июля 2007, 18:54 [#1]:
Вадим К: а если требуется постоянно отображать загрузку процессора, а не единовременно? Чтение из реестра - не лучший вариант.
Ведь есть способ узнать загрузку "системным" способом...
С уважением.
|
|
Вадим К (статус: Академик), 3 июля 2007, 19:18 [#2]:
Вы хорошо посмотрели пример? если присмотритесь внимательно и попробуете найти эту ветку в реесте, то её там нет! а код работает. Почему так? Просто в реестре есть ветка, которая хранит всякую подобную информацию. и находиться она в оперативной памяти. Поэтому чтение с неё ничуть не быстрее вызова высокоуровневых функций. Можно конечно вызывать другие, но они либо читают отсюдова же, либо копают глубже, но толку то?
Повторюсь. Эта ветка реестра виртуальна. на диск она не сохраняется.
>>Ведь есть способ узнать загрузку "системным" способом...
А почему не привели? или боитесь?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Dron (статус: Студент), 3 июля 2007, 19:37 [#3]:
Если честно, про виртуальный реестр не знал Хорошо придумано. Только вот объект тогда имеет смысл создать только один раз, а не создавать и удалять каждый раз при срабатывании таймера.
> А почему не привели? или боитесь?
Чего же бояться-то? Просто начал искать код после ответа на Ваше сообщение...
С уважением.
|
|
Вадим К (статус: Академик), 3 июля 2007, 19:44 [#4]:
Ну если на объекте начать экономить, тогда уже наверно нужно на апи перейти. там уже реально экономия.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 13:56 [#5]:
вадим к твой метод не работает он всегда показывает 100% когда диспетчер задач 2%
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 13:58 [#6]:
да и мне надо именно Цп а не cpu
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 14:01 [#7]:
dron а твой метод работает и показывает именно цп
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 14:02 [#8]:
но я обоим ставлю 5
|
|
Dron (статус: Студент), 4 июля 2007, 14:20 [#9]:
А у меня наоборот - всё время показывает 0%... Вадим, может ошибка в коде где?
С уважением.
|
|
Вадим К (статус: Академик), 4 июля 2007, 14:38 [#10]:
А чем Цп от cpu отличается???
А во вторых с учётом паники майкрософт, что злые пользователи реестр почистят доступ к этому ключу прикрыли. Жаль. Работало раньше просто наура
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Вадим К (статус: Академик), 4 июля 2007, 14:39 [#11]:
а выдавать может что угодно, так как в массив ничего не пишеться...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 14:46 [#12]:
dron кстати от метода который выомп сильно виснет!
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 14:49 [#13]:
dron от метода который вы порекомендовали комп сильно виснет
|
|
Dron (статус: Студент), 4 июля 2007, 14:57 [#14]:
Вадим К: тогда, наверное, стоит проверять предлагаемое решение перед отправкой?
MMO: Хм. У меня ничего не вешает. Может вы интервал обновления поставили слишком маленький или слишком большой? Если слишком большой, то да, будут тормоза, потому что там используется Sleep. В этом случае нужно просто выкинуть всё ненужное и оставить лишь процедуру вывода, которую вызывать откуда-то из другого места (по таймеру например).
С уважением.
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 15:00 [#15]:
а я всегда ставлю 5
|
|
Вадим К (статус: Академик), 4 июля 2007, 15:01 [#16]:
Дело в том, что у меня то работает. просто у меня винда с отключеными разными "в помощь простому юзеру".
То ММО: юзаем потоки! Sleep в основном потоке - зло
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 15:03 [#17]:
dron у меня прога показывает название, версия, путь, язык ОС; версия DOS; тип, тип питания, скорость, имя компьютера; CPU, Фаил подкачки, Виртуальная память; Название видеокарты, название драйверов, разрешение экрана, глубина цвета.
Умеет менять разрешение экрана (!некоторых разрешений даже нет в параметрах экрана)и всё это обновляется каждую секунду может быть по этому после вызова ещё и вацедуры он виснет?
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 15:04 [#18]:
и вашей а не и вацедуры -опечатался
|
|
Dron (статус: Студент), 4 июля 2007, 15:04 [#19]:
> а я всегда ставлю 5
Логичный вопрос: зачем? Остальные оценки для кого придумали? Нужно проверять предлагаемые решения, а только затем ставить оценки...
С уважением.
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 15:05 [#20]:
процедурыабыл
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|