|
Вопрос # 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 (статус: Студент), 4 июля 2007, 15:06 [#21]:
Sleep нужно убрать и обновление делать вручную - тогда висеть не будет.
С уважением.
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 18:54 [#22]:
попробую а всем 5 ставлю за то что откликнулись вас экспертов всего около 80 а помогают около 5 чем занимаются остальные?
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 19:08 [#23]:
dron если убрать sleep то программа выдаёт ошибку а есле снизить время то вообще показывает фигню
|
|
Вадим К (статус: Академик), 4 июля 2007, 19:16 [#24]:
а этот код без sleep работать не будет
я же говорю, юзаем потоки.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 19:46 [#25]:
а как их юзать О_о
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 19:48 [#26]:
блин windows переустанавливать надо безконца сининий экран смерти и клава глючит - вы в этом уже убедились
|
|
Вадим К (статус: Академик), 4 июля 2007, 19:49 [#27]:
Это другой вопрос. Гуглите на тему TThread. А вот если уж ничего не будет - наваяем
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 20:17 [#28]:
уже на яндексе
|
|
Аксион (статус: 4-ый класс), 4 июля 2007, 20:20 [#29]:
Вадим К можно одну прозьбу, переработай код dronа чтобы комп не вис и не было ошибок и опубликуй здесь - буду очень признателен
|
31 января 2011, 19:27: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|