Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загруженность CPU 
:(
    Опции темы
Delphist
  Дата 27.9.2004, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



В реестре есть раздел HKEY_DYN_DATA. Основная информация о системе хранится
в ключе PerfStats.
Например для получения информации о загруженности процессора необходимо:
Просто считать значение ключа 'PerfStats\StartStat\KERNEL\CPUusage' в секции
HKEY_DYN_DATA. данное действие запускает счётчик. После этого в ключе
'PerfStats\StatData\KERNEL\CPUusage' будет храниться значение в процентах о
загруженности процессора.
Этот способ отлично работает в Win9x, но неработает WinNT\2k\Xp. Как добится
того, чтобы это заработало и WinNT\2k\XP.
Заранее спасибо!


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Alex
Дата 27.9.2004, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 6
Всего: 162



Код
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;  


procedure TForm1.Button1Click(Sender: TObject);  
begin  
 GetCPUUsage  
end;  


Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Letov
Дата 7.6.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 22.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 4



Посмотри архив. Там модуль, работает без этого ключа в реестре. А этот ключ практ. не работает.

Присоединённый файл ( Кол-во скачиваний: 32 )
Присоединённый файл  CPU_Usage.zip 14,11 Kb


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.