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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Насколько процесс грузит процессор? Насколько процесс грузит процессор? 
:(
    Опции темы
Budy
Дата 26.4.2006, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 2



:Приветствую
Узнал как узнать текущую загрузку процессора. Теперь хочу узнать насколько % от этого числа определенный процесс грузит процессор.
Заранее спасибо
ps.Проверяю загрузку процесса, вешаю проверку на каждую секунду 


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 26.4.2006, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



DRKB (Delphi Russian Knowledge Base)
Код

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;  

 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Rouse_
Дата 26.4.2006, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 18
Всего: 29



Посмотри лучше вот этот пример: http://rouse.front.ru/taskmon.zip 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Budy
Дата 26.4.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 2



Albinos_x,  тут лишь загрузка процессора.
Меня интерисует сколько из этого грузит определенная прога

Добавлено @ 09:26 
Rouse_,  ах@$%еть, круто smile  


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
MMF
Дата 3.5.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



(Rouse_)       // Хм, ну я фиг знает чего он выше сотни прыгает, короче прибил на корню  smile
        while Result > 100 do Dec(Result, 100);
ИМХО, самое правильное использовать PDH API и не будет проблем (особенно на MPR) 
PM MAIL   Вверх
Rouse_
Дата 3.5.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 18
Всего: 29



Цитата(MMF @  3.5.2006,  11:27 Найти цитируемый пост)
ИМХО, самое правильное использовать PDH API

Не уверен что счетчики производительности дадут полную информацию ;)
Возражения так сказать в студию в виде кода плз smile 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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