如何获取某个进程的cpu占用率?

永远的明日 2011-02-18 10:55:59
请问高手如何获取某个进程的cpu占用率?下面是我写的代码,但是cpu 占用率会超过100%?这是为什么呢?而用GetSystemTimes却可以得到比较准确的值,这又是为什么呢?


#include<windows.h>
#include<stdio.h>
#include <pdh.h>
#include <Tlhelp32.h>
int main()
{
// Find the specified Process
HANDLE hProcess = NULL;
PROCESSENTRY32 pe = {sizeof(pe)};
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL suc = Process32First(hSnapShot, &pe);

while(suc)
{
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, pe.th32ProcessID);
if(hProcess != NULL)
{
if(strcmp(pe.szExeFile, "1080.exe") == 0)
{
break;
}
}
CloseHandle(hProcess);
suc = Process32Next(hSnapShot, &pe);
}
// Got it
if(suc)
{
SYSTEMTIME LastSysTime, CurSysTime;
ULARGE_INTEGER ulLastSysTime, ulCurSysTime;
ULARGE_INTEGER ulStart, ulEnd,
ulLastProcKernelTime, ulLastProcUserTime,
ulCurProcKernelTime, ulCurProcUserTime;
ULARGE_INTEGER ulKernelTimeUsed ,ulUserTimeUsed, ulSysTimePast;
int iCpuUsage = 0;


GetSystemTime(&LastSysTime);
GetProcessTimes(hProcess, (LPFILETIME)&ulStart, (PFILETIME)&ulEnd,
(PFILETIME)&ulLastProcKernelTime, (PFILETIME)&ulLastProcUserTime);
while(1)
{

Sleep(1000);

GetProcessTimes(hProcess, (PFILETIME)&ulStart, (PFILETIME)&ulEnd,
(PFILETIME)&ulCurProcKernelTime, (PFILETIME)&ulCurProcUserTime);
GetSystemTime(&CurSysTime);
SystemTimeToFileTime(&LastSysTime, (PFILETIME)&ulLastSysTime);
SystemTimeToFileTime(&CurSysTime, (PFILETIME)&ulCurSysTime);

ulKernelTimeUsed.QuadPart = ulCurProcKernelTime.QuadPart - ulLastProcKernelTime.QuadPart;
ulUserTimeUsed.QuadPart = ulCurProcUserTime.QuadPart - ulLastProcUserTime.QuadPart;
ulSysTimePast.QuadPart = ulCurSysTime.QuadPart - ulLastSysTime.QuadPart;
iCpuUsage = (ulKernelTimeUsed.QuadPart + ulUserTimeUsed.QuadPart)*100 / ulSysTimePast.QuadPart;

printf("The Process use %3d%%\n", iCpuUsage);

LastSysTime = CurSysTime;
ulLastProcKernelTime = ulCurProcKernelTime;
ulLastProcUserTime = ulCurProcUserTime;
}
}
return 0;
}
...全文
1529 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
东莞某某某 2013-02-26
  • 打赏
  • 举报
回复
WMI好像也可以获取到
xiaopig0516 2013-02-26
  • 打赏
  • 举报
回复
可用使用snmp,简单网络管理协议做到.每个进程使用的CPU,内存情况.
zhdj1109 2012-09-12
  • 打赏
  • 举报
回复
顶一个!求指教!
IsItNothing 2011-03-23
  • 打赏
  • 举报
回复
用性能计数器获得。
chzhn 2011-03-07
  • 打赏
  • 举报
回复
360的进程在用户态无解。
chzhn 2011-03-07
  • 打赏
  • 举报
回复
这就是量子力学中的测不准原理,你搞个死循环去获取CPU使用率,当然会导致CPU使用100%了。
smwhotjay 2011-03-07
  • 打赏
  • 举报
回复
360 r0里hook了打开进程句柄api,是360的则返回伪handle
xengine-qyt 2011-02-24
  • 打赏
  • 举报
回复


我也不清楚,反正360肯定保护了自己的进程,你想打开没那么容易!

这需要对底层和汇编以及安全编程熟悉的,爱莫能助。。。看雪应该能帮到你!
永远的明日 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 aaadddzxc 的回复:]
360的能让你这么容易打开?那360可以关门大吉了。去看雪 问。这需要驱动层的东东!
[/Quote]

不能打开,那怎么办?我只是想做一个类似任务管理器的功能·没有说要QJ 360
xengine-qyt 2011-02-23
  • 打赏
  • 举报
回复
360的能让你这么容易打开?那360可以关门大吉了。去看雪 问。这需要驱动层的东东!
永远的明日 2011-02-23
  • 打赏
  • 举报
回复
大大,跪求帮帮忙啊~
永远的明日 2011-02-19
  • 打赏
  • 举报
回复
自己Up一下··
永远的明日 2011-02-18
  • 打赏
  • 举报
回复
.......while中有Sleep啊··
fishion 2011-02-18
  • 打赏
  • 举报
回复
开线程或者在while的里面都添加sleep
oyljerry 2011-02-18
  • 打赏
  • 举报
回复
开线程去调用获取CPU代码,不然你的程序一直while占用CPU。
永远的明日 2011-02-18
  • 打赏
  • 举报
回复
之前没考虑多核··我将原来的Cpu占用率再除以cpu数,得到的结果基本与任务管理器的差不多了·
不过还有一个问题,就是无法获取部分进程(系统进程、360)的HANDLE,请都各位大大,这该如何是好啊?


#include<windows.h>
#include<stdio.h>
#include <pdh.h>
#include <Tlhelp32.h>
int main()
{
// Find the specified Process
HANDLE hProcess = NULL;
PROCESSENTRY32 pe = {sizeof(pe)};
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL suc = Process32First(hSnapShot, &pe);

while(suc)
{
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, pe.th32ProcessID);
if(hProcess != NULL)
{
if(strcmp(pe.szExeFile, "1080.exe") == 0)
{
break;
}
}
CloseHandle(hProcess);
suc = Process32Next(hSnapShot, &pe);
}
// Got it
if(suc)
{
ULARGE_INTEGER ulLastSysTime, ulCurSysTime;
ULARGE_INTEGER ulStart, ulEnd,
ulLastProcKernelTime, ulLastProcUserTime,
ulCurProcKernelTime, ulCurProcUserTime;
ULARGE_INTEGER ulKernelTimeUsed ,ulUserTimeUsed, ulSysTimePast;
SYSTEM_INFO si = {0};
int iCpuUsage = 0;

GetSystemInfo(&si);
GetSystemTimeAsFileTime((PFILETIME)&ulLastSysTime);
GetProcessTimes(hProcess, (PFILETIME)&ulStart, (PFILETIME)&ulEnd,
(PFILETIME)&ulLastProcKernelTime, (PFILETIME)&ulLastProcUserTime);

while(1)
{

Sleep(1000);

GetProcessTimes(hProcess, (PFILETIME)&ulStart, (PFILETIME)&ulEnd,
(PFILETIME)&ulCurProcKernelTime, (PFILETIME)&ulCurProcUserTime);
GetSystemTimeAsFileTime((PFILETIME)&ulCurSysTime);

ulKernelTimeUsed.QuadPart = ulCurProcKernelTime.QuadPart - ulLastProcKernelTime.QuadPart;
ulUserTimeUsed.QuadPart = ulCurProcUserTime.QuadPart - ulLastProcUserTime.QuadPart;
ulSysTimePast.QuadPart = ulCurSysTime.QuadPart - ulLastSysTime.QuadPart;

iCpuUsage = (ulKernelTimeUsed.QuadPart + ulUserTimeUsed.QuadPart)*100 /
(si.dwNumberOfProcessors*ulSysTimePast.QuadPart);

printf("The Process use %3d%%\n", iCpuUsage);

ulLastSysTime = ulCurSysTime;
ulLastProcKernelTime = ulCurProcKernelTime;
ulLastProcUserTime = ulCurProcUserTime;
}
}
return 0;
}

15,474

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧