通过性能计数器(Process)来获取某个进程的CPU使用率、内存使用量、磁盘读写速率

来源:互联网 发布:淘宝好评模板100字 编辑:程序博客网 时间:2024/06/01 07:56

本篇文章是在上次获取整个系统性能数据的延伸。

需求:获取某个进程(已知进程名)的CPU使用率、内存使用量、磁盘读写速率

实现:通过windows自带的性能计数器中的Process实现


与之前获取整个系统性能数据的流程是一样的,打开性能计数器——添加性能计数器——获取数据。

下面是具体的性能计数器查询语句,"tfb_manage_system"是进程名(tfb_manage_system.exe)。

获取CPU使用率:"\\Process(tfb_manage_system)\\% Processor Time"        ps:需要注意一点,这里拿到的数据是对于单核CPU的使用率,所以,对于整个系统的使用率,需要将本数据除以系统CPU核心数量。比如拿到的数据是80%,系统是四核,那该进程真实的CPU占用率是80 / 4 = 20%。

获取内存使用量:"\\Process(tfb_manage_system)\\Working Set - Private"        获取的专用内存使用量。单位是字节

获取磁盘读速率:"\\Process(tfb_manage_system)\\IO Read Bytes/sec"        单位是字节 / 秒

获取磁盘写速率:"\\Process(tfb_manage_system)\\IO Write Bytes/sec"        单位是字节 / 秒


下面是实现代码:

/*通过性能计数器获取某个进程的CPU使用率、内存使用量、磁盘读写速率使用性能计数器中的Process实现*/#pragmacomment(lib,"pdh")#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <locale.h>#include <pdh.h>#include <pdhmsg.h>#include <tchar.h>#include <windows.h>int nCPU;int GetData(){HQUERY query;  double dbVal;long iVal;PDH_STATUS status = PdhOpenQuery(NULL, NULL, &query);  if (ERROR_SUCCESS != status)  {  MessageBox(NULL,TEXT("打开失败"),TEXT(""),MB_OK);  return -1;  }HCOUNTER cntProcessCPU, cntProcessMemory;HCOUNTER cntProcessDiskRead, cntProcessDiskWrite;status = PdhAddCounter(query, "\\Process(tfb_manage_system)\\% Processor Time", NULL, &cntProcessCPU);status = PdhAddCounter(query, "\\Process(tfb_manage_system)\\Working Set - Private", NULL, &cntProcessMemory);status = PdhAddCounter(query, "\\Process(tfb_manage_system)\\IO Read Bytes/sec", NULL, &cntProcessDiskRead);status = PdhAddCounter(query, "\\Process(tfb_manage_system)\\IO Write Bytes/sec", NULL, &cntProcessDiskWrite);if (ERROR_SUCCESS != status)  {  MessageBox(NULL,TEXT("添加失败"),TEXT(""),MB_OK);  return -1;  }status = PdhCollectQueryData(query);        Sleep(500);                 //这里要有延时不然结果相当不准确  status = PdhCollectQueryData(query);  if(ERROR_SUCCESS != status)  {  MessageBox(NULL,TEXT("数据请求失败"),TEXT(""),MB_OK);  return -1;  }  PDH_FMT_COUNTERVALUE pdhValue;       DWORD dwValue;  status = PdhGetFormattedCounterValue(cntProcessCPU, PDH_FMT_DOUBLE, &dwValue, &pdhValue);  if(ERROR_SUCCESS != status)  {  MessageBox(NULL,TEXT("得到数据失败"),TEXT(""),MB_OK);  return -1;  }else{dbVal = pdhValue.doubleValue;  printf("Process-CPU:          %3d%%          ", (int)(dbVal/nCPU+0.5));}status = PdhGetFormattedCounterValue(cntProcessMemory, PDH_FMT_DOUBLE, &dwValue, &pdhValue);  if(ERROR_SUCCESS != status)  {  MessageBox(NULL,TEXT("得到数据失败"),TEXT(""),MB_OK);  return -1;  }else{dbVal = pdhValue.doubleValue;  printf("Process-Memory:     %8dK        \n", (int)(dbVal/1024));}status = PdhGetFormattedCounterValue(cntProcessDiskRead, PDH_FMT_DOUBLE, &dwValue, &pdhValue);  if(ERROR_SUCCESS != status)  {  MessageBox(NULL,TEXT("得到数据失败"),TEXT(""),MB_OK);  return -1;  }else{dbVal = pdhValue.doubleValue;  printf("Process-DiskRead:%8dK/s        ", (int)(dbVal/1024));}status = PdhGetFormattedCounterValue(cntProcessDiskWrite, PDH_FMT_DOUBLE, &dwValue, &pdhValue);  if(ERROR_SUCCESS != status)  {  MessageBox(NULL,TEXT("得到数据失败"),TEXT(""),MB_OK);  return -1;  }else{dbVal = pdhValue.doubleValue;  printf("Process-DiskWrite:%8dK/s        \n*****************************************************************************\n", (int)(dbVal/1024));}PdhRemoveCounter(cntProcessCPU);PdhRemoveCounter(cntProcessMemory);PdhRemoveCounter(cntProcessDiskRead);PdhRemoveCounter(cntProcessDiskWrite);PdhCloseQuery(query);}int main() {setlocale(LC_ALL,"chs");SYSTEM_INFO si;GetSystemInfo(&si);nCPU = si.dwNumberOfProcessors;while(1){Sleep(500);GetData();}system("pause");return 0;}


阅读全文
0 0