точное использование системного процессора в windows - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над добавлением монитора использования процессора в свой монитор процессов, и я решил использовать NtQuerySystemInformation, так как это самый низкий API, который я могу использовать для более точного вычисления, приведенный ниже код хорошо работает, когда загрузка процессора несколько высока, но когдаПроцессор почти простаивает (10: 30), он не показывает процент использования, как в диспетчере задач, он не отображает использование ниже 26%, однако диспетчер задач показывает его 15% или почти процент

этомой код:

double accurate_usage() {

  SYSTEM_INFO info = { 0 };
  GetSystemInfo(&info);
  DWORD proc_num = info.dwNumberOfProcessors;
  PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION old_values = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[proc_num];
  PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION new_values = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[proc_num];
  FILETIME old_time = { 0 }, new_time = { 0 };
  ULARGE_INTEGER uold_time = { 0 }, unew_time = { 0 };

  ULONG size;
  fNtQuerySystemInformation(SystemProcessorPerformanceInformation, old_values, sizeof(old_values[0]) * proc_num, &size);
  GetSystemTimeAsFileTime(&old_time);
  memcpy(&uold_time, &old_time, sizeof(FILETIME));
  Sleep(1000);
  fNtQuerySystemInformation(SystemProcessorPerformanceInformation, new_values, sizeof(old_values[0]) * proc_num, &size);
  GetSystemTimeAsFileTime(&new_time);
  memcpy(&unew_time, &new_time, sizeof(FILETIME));

  double percent = 0.0;
  for (DWORD i = 0; i < proc_num; ++i) {
      double current_percent = (new_values[i].KernelTime.QuadPart - old_values[i].KernelTime.QuadPart) +
      (new_values[i].UserTime.QuadPart - old_values[i].UserTime.QuadPart) - 
      (new_values[i].IdleTime.QuadPart - old_values[i].IdleTime.QuadPart);
      current_percent /= (unew_time.QuadPart - uold_time.QuadPart);
      current_percent /= proc_num;
      current_percent *= 100;
      percent += current_percent;
  }
  return percent;
}

1 Ответ

0 голосов
/ 14 ноября 2018

рабочий код:

double accurate_usage() {

  SYSTEM_INFO info = { 0 };
  GetSystemInfo(&info);
  DWORD proc_num = info.dwNumberOfProcessors;
  PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION old_values = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[proc_num];
  PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION new_values = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[proc_num];
  FILETIME old_time = { 0 }, new_time = { 0 };
  ULARGE_INTEGER uold_time = { 0 }, unew_time = { 0 };

  ULONG size;
  fNtQuerySystemInformation(SystemProcessorPerformanceInformation, old_values, sizeof(old_values[0]) * proc_num, &size);
  GetSystemTimeAsFileTime(&old_time);
  memcpy(&uold_time, &old_time, sizeof(FILETIME));
  Sleep(1000);
  fNtQuerySystemInformation(SystemProcessorPerformanceInformation, new_values, sizeof(old_values[0]) * proc_num, &size);
  GetSystemTimeAsFileTime(&new_time);
  memcpy(&unew_time, &new_time, sizeof(FILETIME));

  double percent = 0.0;
  for (DWORD i = 0; i < proc_num; ++i) {
      double current_percent = (new_values[i].IdleTime.QuadPart - old_values[i].IdleTime.QuadPart) * 100 ;
      current_percent /= ((new_values[i].KernelTime.QuadPart + new_values[i].UserTime.QuadPart) - (old_values[i].KernelTime.QuadPart + old_values[i].UserTime.QuadPart));
      current_percent = 100 - current_percent;
      percent += current_percent;
  }
  return percent / 10;
}
...