最近在做一个东西,要实现类似于任务管理里看内存使用率的功能,已经写了代码如下,但是得不到数据,还望指点: 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里面就是内存使用率了。

解决方案 »

  1.   

    ntdll.dll NtQuerySystemInformation()
      

  2.   

    Processor Time   --- 拿的 是CPU使用率
      

  3.   

    不好意思,发帖的时候将错了,确实是CPU使用率。
      

  4.   

    const wchar_t str1[] = _TEXT ("\\Process(conhost)\\%Processor Time"); 
      

  5.   

    可以调用GetProcessTimes获得进程的各种时间,自己计算出CPU使用率。
      

  6.   

    5#的意见我重新试了下,MS还是不行啊~~  郁闷。能不能帮我调调看?头文件是:#include <Pdh.h>
    #pragma comment ( lib , "Pdh.lib" )
    LS的满天星貌似很....敷衍
      

  7.   

    % Processor Time  ?
     ^
      

  8.   

    http://www.google.com/codesearch/p?hl=en#EaFb_qlC32E/Ice-3.2.0/src/IceGrid/PlatformInfo.cpp&q=PdhAddCounter%20lang:c%2B%2B&l=476不知能否有帮助
      

  9.   

    pdhStatus = PdhAddCounter ( hQuery , _TEXT ("\\Process(_TEXT("conhost"))\\%Processor Time") , 0 , pCounterHandle ) ;
      

  10.   

    pdhStatus=PdhOpenQuery(0,0,&hQuery);  这一行执行完后,pdhStatus=0。hQuery也有值了已经。
    pCounterHandle = ( HCOUNTER * ) GlobalAlloc ( GPTR , sizeof ( HCOUNTER ) ) ;这行里的pCounterHandle貌似也成功地取到了。
    从pdhStatus = PdhAddCounter ( hQuery , _TEXT("\\Process(conhost) \\%Processor Time") , 0 , pCounterHandle ) ;往后,发现pdhStatus的值都是很大的负值,负得非常厉害的值,估计失败了。
      

  11.   

    你不是要得到某个进程的CPU使用率吗?用GetProcessTimes就可以实现。pdh我没用过,看了一眼MSDN,你上面代码中PdhAddCounter调用参数有错,应该这样写:
    pdhStatus = PdhAddCounter(hQuery, _TEXT("\\Process(conhost)\\% Processor Time"), 0, pCounterHandle);
      

  12.   

    查看一下错误的值 GetLastError,%
      

  13.   

    我后来修改成了pdhStatus = PdhAddCounter(hQuery, _TEXT("\\Process(conhost)\\% Processor Time"), 0, pCounterHandle);
    还是不行。至于楼上说的,不太行啊,因为它根本就没报错误啊,函数执行成功了,只是没有取到值而已。楼上的能不能把我的代码自己放进IDE调试下亲自看看?回13#,我知道GetProcessTimes行,但我想好好学习下Windows性能计数器。学技术不为目的,而为充电。
      

  14.   

    HQUERY hQuery;
    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);
      

  15.   


    http://www.eggheadcafe.com/forumarchives/win32programmerkernel/Jun2005/post23439532.asp
      

  16.   

    这个比较详细
    http://support.microsoft.com/kb/262938/zh-cn
      

  17.   

    贴出求所有CPU使用率的代码,望某位高手帮我单步调试下,究竟是哪里出了问题,一个进程不行,我只能退而求其次,看所有的CPU使用率了:
    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使用率
      

  18.   

    调试了一下,需要注意两个地方
    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);
      

  19.   

    仁兄,你代码测试过没?我按你说的又试过了,不行。你可否自己在IDE里调试看看?