最近在做一个东西,要实现类似于任务管理里看内存使用率的功能,已经写了代码如下,但是得不到数据,还望指点: HQUERY hQuery=NULL;
PDH_STATUS pdhStatus ;
HCOUNTER * pCounterHandle = NULL ;
pdhStatus=PdhOpenQuery(0,0,&hQuery);
pCounterHandle = ( HCOUNTER * ) GlobalAlloc ( GPTR , sizeof ( HCOUNTER ) ) ;
PDH_FMT_COUNTERVALUE fmtValue ;
DWORD dwctrType ;
pdhStatus = PdhAddCounter ( hQuery , _TEXT ("\\Process(\"conhost\") \\%Processor Time") , 0 , pCounterHandle ) ;
pdhStatus = PdhCollectQueryData ( hQuery ) ;
pdhStatus = PdhGetFormattedCounterValue ( * pCounterHandle , PDH_FMT_DOUBLE , & dwctrType , & fmtValue ) ;
pdhStatus = PdhCloseQuery ( hQuery ) ;想得到conhost进程的内存使用率,我MSDN都翻了很多遍了,还是不知道错在哪里?
如果成功的话,fmtValue.doubleValue里面就是内存使用率了。
PDH_STATUS pdhStatus ;
HCOUNTER * pCounterHandle = NULL ;
pdhStatus=PdhOpenQuery(0,0,&hQuery);
pCounterHandle = ( HCOUNTER * ) GlobalAlloc ( GPTR , sizeof ( HCOUNTER ) ) ;
PDH_FMT_COUNTERVALUE fmtValue ;
DWORD dwctrType ;
pdhStatus = PdhAddCounter ( hQuery , _TEXT ("\\Process(\"conhost\") \\%Processor Time") , 0 , pCounterHandle ) ;
pdhStatus = PdhCollectQueryData ( hQuery ) ;
pdhStatus = PdhGetFormattedCounterValue ( * pCounterHandle , PDH_FMT_DOUBLE , & dwctrType , & fmtValue ) ;
pdhStatus = PdhCloseQuery ( hQuery ) ;想得到conhost进程的内存使用率,我MSDN都翻了很多遍了,还是不知道错在哪里?
如果成功的话,fmtValue.doubleValue里面就是内存使用率了。
#pragma comment ( lib , "Pdh.lib" )
LS的满天星貌似很....敷衍
^
pCounterHandle = ( HCOUNTER * ) GlobalAlloc ( GPTR , sizeof ( HCOUNTER ) ) ;这行里的pCounterHandle貌似也成功地取到了。
从pdhStatus = PdhAddCounter ( hQuery , _TEXT("\\Process(conhost) \\%Processor Time") , 0 , pCounterHandle ) ;往后,发现pdhStatus的值都是很大的负值,负得非常厉害的值,估计失败了。
pdhStatus = PdhAddCounter(hQuery, _TEXT("\\Process(conhost)\\% Processor Time"), 0, pCounterHandle);
还是不行。至于楼上说的,不太行啊,因为它根本就没报错误啊,函数执行成功了,只是没有取到值而已。楼上的能不能把我的代码自己放进IDE调试下亲自看看?回13#,我知道GetProcessTimes行,但我想好好学习下Windows性能计数器。学技术不为目的,而为充电。
PDH_STATUS pdhStatus = PdhOpenQuery(0, 0, &hQuery);
HCOUNTER pCounterHandle;
PDH_FMT_COUNTERVALUE fmtValue;
DWORD dwctrType;
pdhStatus = PdhAddCounter(hQuery, _TEXT("\\Process(conhost)\\% Processor Time"), 0, &pCounterHandle);
pdhStatus = PdhCollectQueryData(hQuery);
Sleep(1000);
pdhStatus = PdhCollectQueryData(hQuery);
pdhStatus = PdhGetFormattedCounterValue(pCounterHandle, PDH_FMT_DOUBLE, &dwctrType, &fmtValue);
pdhStatus = PdhCloseQuery(hQuery);
http://www.eggheadcafe.com/forumarchives/win32programmerkernel/Jun2005/post23439532.asp
http://support.microsoft.com/kb/262938/zh-cn
HQUERY hQuery=NULL;
PDH_STATUS pdhStatus ;
HCOUNTER * pCounterHandle = NULL ;
pdhStatus=PdhOpenQuery(0,0,&hQuery);
pCounterHandle = ( HCOUNTER * ) GlobalAlloc ( GPTR , sizeof ( HCOUNTER ) ) ;
PDH_FMT_COUNTERVALUE fmtValue ;
DWORD dwctrType ;
_try
{
pdhStatus = PdhAddCounter (hQuery , _TEXT("\\Process(0) \\%Processor Time") , 0 , pCounterHandle ) ;//ERROR
if(pdhStatus!=ERROR_SUCCESS)
{
__leave;
}
pdhStatus = PdhCollectQueryData ( hQuery ) ;
if(pdhStatus!=ERROR_SUCCESS)
{
__leave;
}
::Sleep(500);
pdhStatus = PdhGetFormattedCounterValue ( * pCounterHandle , PDH_FMT_DOUBLE , & dwctrType , & fmtValue ) ;
if(pdhStatus!=ERROR_SUCCESS)
{
__leave;
}
}
__finally
{
AbnormalTermination();
}
pdhStatus = PdhCloseQuery ( hQuery ) ;
希望目标:fmtValue.doubleValue里面的值就是CPU使用率
1、计数器路径应为:"\\Process(Thunder5)\\% Processor Time"
进程名不需要双引号,%后面有一个空格。
2、根据http://support.microsoft.com/kb/262938/en-us/的描述(18楼的是中文描述,不过翻译的有点拗口):
使用% Processor Time需要有两个sample,因此在调用PdhGetFormattedCounterValue之前需要再调用PdhCollectQueryData一次。pdhStatus = PdhAddCounter( hQuery , _TEXT("\\Process(Thunder5)\\% Processor Time") , 0 , pCounterHandle ) ;
pdhStatus = PdhCollectQueryData ( hQuery ) ;
Sleep(100);
pdhStatus = PdhCollectQueryData ( hQuery ) ;
pdhStatus = PdhGetFormattedCounterValue ( * pCounterHandle,
PDH_FMT_DOUBLE,
& dwctrType,
& fmtValue ) ;
printf("CPU: %f",fmtValue.doubleValue);