请问:如何获得CPU的利用率?(高分求助!)

seasun2k 2001-11-29 04:52:25
...全文
153 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
seasun2k 2001-12-11
  • 打赏
  • 举报
回复
up up up
MSVCer 2001-12-10
  • 打赏
  • 举报
回复
gzz
seasun2k 2001-12-10
  • 打赏
  • 举报
回复
同志们,我还是取不到像性能监视器那样的值,大家帮帮忙!我急用...
我要得到的是整个CPU的利用率。不是某个进程的利用率。我要得到的也不是某个时间点的CPU利用率,想得到的是某段时间的平均值。我的目的是将CPU的利用率作为负载平衡调度的度量单位。
mzm100 2001-12-01
  • 打赏
  • 举报
回复
>>为什么我使用
>>PdhGetFormattedCounterValue(pCounter->hCounter, PDH_FMT_LONG, NULL, >>&pdhFormattedValue),调用完成后,得到的CPU占用率为99,而Sleep以后,再调用,得>>到的还是99呢?
你得到的是系统的CPU使用率,要得到某一进程的CPU使用率,要在PDHAddCounter指明为哪一进程,如:
pdhStatus = PdhAddCounter (hQCputime,
TEXT("\\Process(StreamSrv)\\% Processor Time"),
0,
&hCounter1);
seasun2k 2001-11-30
  • 打赏
  • 举报
回复
为什么我使用
PdhGetFormattedCounterValue(pCounter->hCounter, PDH_FMT_LONG, NULL, &pdhFormattedValue),调用完成后,得到的CPU占用率为99,而Sleep以后,再调用,得到的还是99呢?
HWLee 2001-11-30
  • 打赏
  • 举报
回复
winNT、win2000下:

#define CNTR_CPU "\\Processor(_Total)\\% Processor Time" // % of cpu in use

//函数类型定义(will load from pdh.dll)
typedef PDH_STATUS(FAR PASCAL *PPDHCLOSEQUERY)(HQUERY);
typedef PDH_STATUS(FAR PASCAL *PPDHOPENQUERY)(LPCTSTR, DWORD , HQUERY *);
typedef PDH_STATUS(FAR PASCAL *PPDHADDCOUNTER)(HQUERY, LPCTSTR, DWORD, HCOUNTER *);
typedef PDH_STATUS(FAR PASCAL *PPDHCOLLECTQUERYDATA)(HQUERY);
typedef PDH_STATUS(FAR PASCAL *PPDHGETFORMATTEDCOUNTERVALUE)(
HCOUNTER hCounter,
DWORD dwFormat,
LPDWORD lpdwType,
PPDH_FMT_COUNTERVALUE pValue
);

//函数指针定义
PPDHCLOSEQUERY pPdhCloseQuery;
PPDHOPENQUERY pPdhOpenQuery;
PPDHADDCOUNTER pPdhAddCounter;
PPDHCOLLECTQUERYDATA pPdhCollectQueryData;
PPDHGETFORMATTEDCOUNTERVALUE pPdhGetFormattedCounterValue;

//Load PDH.dll
int LoadPDHDll(void)
{
//Load library
int nRet = 0;
HMODULE hDll = LoadLibrary("pdh.dll");
if(!hDll)
{
ShowLastErrMsg();
return -1;
}

pPdhCloseQuery = (PPDHCLOSEQUERY)GetProcAddress(hDll, "PdhCloseQuery");
if(!pPdhCloseQuery)
{
ShowLastErrMsg();
return -1;
}
pPdhOpenQuery = (PPDHOPENQUERY)GetProcAddress(hDll, "PdhOpenQueryA");
if(!pPdhOpenQuery)
{
ShowLastErrMsg();
return -1;
}
pPdhAddCounter = (PPDHADDCOUNTER)GetProcAddress(hDll, "PdhAddCounterA");
if(!pPdhAddCounter)
{
ShowLastErrMsg();
return -1;
}
pPdhCollectQueryData = (PPDHCOLLECTQUERYDATA)GetProcAddress(hDll, "PdhCollectQueryData");
if(!pPdhCollectQueryData)
{
ShowLastErrMsg();
return -1;
}
pPdhGetFormattedCounterValue = (PPDHGETFORMATTEDCOUNTERVALUE)GetProcAddress(hDll, "PdhGetFormattedCounterValue");
if(!pPdhGetFormattedCounterValue)
{
ShowLastErrMsg();
return -1;
}

return 0;
}
//以下是Get cpu 利用率的代码示例,支持多cpu。取得的是多个cpu利用率的平均值

char strCPUInfo[10] = {0};
DWORD dwFormat = PDH_FMT_LONG;
PDH_FMT_COUNTERVALUE *lpItemBuffer;

if(!bInitedFlag)
{
bInitedFlag = TRUE;
if (pPdhOpenQuery(NULL,1,&hPDHQuery) != ERROR_SUCCESS)
return -1;


// add to current query
if (pPdhAddCounter(hPDHQuery,CNTR_CPU,0,&hPDHCounter) != ERROR_SUCCESS)
{
return -1;
}
}

// Allocate the counter value structure.
lpItemBuffer = (PDH_FMT_COUNTERVALUE *) GlobalAlloc
(GPTR, sizeof(PDH_FMT_COUNTERVALUE));

if (pPdhCollectQueryData(hPDHQuery) != ERROR_SUCCESS)
{
return -1;
}
// get the value from the PDH
if (pPdhGetFormattedCounterValue(hPDHCounter,
dwFormat,(LPDWORD)NULL, lpItemBuffer) != ERROR_SUCCESS)
{
return -1;
}
// test the value for validity
if (lpItemBuffer->CStatus != ERROR_SUCCESS)
{
return -1;
}

// set value
sprintf(strCPUInfo,"%5.2f",(float)lpItemBuffer->longValue + 1);
HWLee 2001-11-30
  • 打赏
  • 举报
回复
win95或win98环境下:
HKEY key;
DWORD dwIndex = 0;
long lError;
unsigned long nValue;
char strCPUInfo[10] = {0};
TCHAR szPrinter[100];
DWORD dwSize = 100, nSize = sizeof(long);


if(RegOpenKeyEx(HKEY_DYN_DATA, _T("PerfStats\\StatData"), 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS)
return -1;
do
{
if((lError = RegEnumValue(key, dwIndex++, szPrinter, &dwSize, NULL, &nValue, NULL, &nSize)) != ERROR_SUCCESS)
{
RegCloseKey(key);
return -1;
}
dwSize = 100;
}while(strcmp(szPrinter, "KERNEL\\CPUUsage"));

sprintf(strCPUInfo,"%5.2f",(float)nValue);

zj_ok 2001-11-30
  • 打赏
  • 举报
回复
pdh函数
seasun2k 2001-11-30
  • 打赏
  • 举报
回复
\\Processor(_Total)\\% Processor Time 时候为:99.999315859528这种结果.
而为:\\Processor(_Total)\\% User Time 时候为:6.4791656793412e-005这种结果,
这个结果如何转化为CPU占有率5%,10%这样的参数??
mzm100 2001-11-29
  • 打赏
  • 举报
回复
98还是2000?
zzh 2001-11-29
  • 打赏
  • 举报
回复
在Windows2000系统内幕这本书中有介绍
Jneu 2001-11-29
  • 打赏
  • 举报
回复
在注册表里~
masterz 2001-11-29
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/Topic/184/184198.shtm
masterz 2001-11-29
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/Topic/284/284153.shtm

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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