真的没有人会? 加分 加分 加分---------- vc 如何获得当前每个进程cpu的利用率?

cmh360 2008-10-14 03:46:58
如题!
...全文
204 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
caitian6 2008-10-14
  • 打赏
  • 举报
回复
UP
WinEggDrop 2008-10-14
  • 打赏
  • 举报
回复
使用pdh的API最简单.

LONG GetProcessCPUUsage()
{

HQUERY hQuery;
HCOUNTER hCounter;
PDH_FMT_COUNTERVALUE fmtValue;
DWORD ctrType;
typedef HANDLE PDH_HQUERY;
typedef HANDLE PDH_HCOUNTER;

char PathBuffer[MAX_PATH] = {0};
ZeroMemory(PathBuffer,sizeof(PathBuffer));
_snprintf(PathBuffer,sizeof(PathBuffer) - 1,"\\Process(%s)\\%c Processor Time","explorer",'%');

if (PdhOpenQuery(0,0,&hQuery) == ERROR_SUCCESS)
{
if (PdhAddCounter(hQuery,PathBuffer,0,&hCounter) == ERROR_SUCCESS)
{
LONG Start = 0;
LONG End = 0;

for (UINT i = 0 ; i < 2; i++)
{
if (PdhCollectQueryData(hQuery) == ERROR_SUCCESS)
{
if (PdhGetFormattedCounterValue(hCounter,PDH_FMT_LONG,&ctrType,&fmtValue) == ERROR_SUCCESS)
{
if (i == 0)
{
Start = fmtValue.longValue;
}
else
{
End = fmtValue.longValue;
if (End > Start)
{
PdhCloseQuery(hQuery);
return (End - Start);
}
else
{
PdhCloseQuery(hQuery);
return End;
}
}
}
else
{
break;
}
}
else
{
break;
}
Sleep(1000);
}
}
PdhCloseQuery(hQuery);
}
return -1;
}

以上代码得到explorer的CPU使用率,自己改下就能适用于所有系统进程.
cppwin 2008-10-14
  • 打赏
  • 举报
回复
刚看到一篇文章,你看看是否有用.
<Getting CPU Usage in a Multiprocessor Machine>
http://www.codeproject.com/KB/system/MultiCPUUsage.aspx
LWYY52243548 2008-10-14
  • 打赏
  • 举报
回复
这贴以前就有人问过,你找找吧,网上大把资料.
要得到远程主机的cpu利用率应该在远程主机上有相关服务才行,当然你自己也可以做一个客户端和服务端,用客户端连接到服务端上,然后用服务端来得到数据并发送回客户端。
得到数据可以参见:
BOOL GetProcessTimes(
HANDLE hProcess, // handle to process
LPFILETIME lpCreationTime, // process creation time
LPFILETIME lpExitTime, // process exit time
LPFILETIME lpKernelTime, // process kernel-mode time
LPFILETIME lpUserTime // process user-mode time
);
所有的内核时间+用户时间就是cpu时间,也就是cpu利用率。
当然这里面要得到所有进程的句柄才行,得到所有进程句柄可以参见:
// copy right @ 1995-2001 for bsmith in Zhejiang university
// no use in mechical
HANDLE FSnapshotHandle;
HANDLE hProcess;
PROCESSENTRY32 FProcessEntry32;
BOOL ContinueLoop;
FSnapshotHandle
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize
= sizeof(FProcessEntry32);
ContinueLoop
= Process32First(FSnapshotHandle,& FProcessEntry32);
while (ContinueLoop)
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE,
FProcessEntry32.th32ProcessID);
CloseHandle(hProcess);
ContinueLoop
= Process32Next(FSnapshotHandle,& FProcessEntry32);
}
CloseHandle(FSnapshotHandle);
还没淹死的鱼 2008-10-14
  • 打赏
  • 举报
回复
GOOGLE搜一下就一堆一堆的
cnzdgs 2008-10-14
  • 打赏
  • 举报
回复
GetProcessTimes可以取得进程在内核模式和用户模式所占用的CPU时间,加在一起就是总时间。在一段时间内,两次调用GetProcessTimes,将时间的差值除以间隔时间就是CPU的占用率。
shenyi0106 2008-10-14
  • 打赏
  • 举报
回复
一般来说,每个进程只能获得自己的系统状态数据,
所以建议你转换一下思路,不放用HOOK来做
dch4890164 2008-10-14
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/system/Task_Manager_Extension.aspx
这个是你想要的 task manager的实现版 含源码
zhoujianhei 2008-10-14
  • 打赏
  • 举报
回复
任务管理器
zhoujianhei 2008-10-14
  • 打赏
  • 举报
回复
我收藏的资源管理器

http://d.download.csdn.net/down/529874/zhoujianhei


15,471

社区成员

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

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