2017-04-11 155 views
1

我需要检索CPU的总使用率,以便反馈系统根据CPU是否受到限制来更改行为。对于这一点,我看着NtQuerySystemInformation SYS调用,它在任何给定时间提供系统的信息,但好像这个功能已经在Windows的最新版本已经过时了,因为MSDN页说如何从C++的Windows中检索总系统CPU使用率?

[NtQuerySystemInformation可以变更或不可用Windows的未来 版本。应用程序应该使用本主题中列出的备选功能 ]

参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx

有谁知道这个调用支持哪些操作系统版本? Win 7/8/8.1/10?有没有其他方法可以直接检索总CPU使用率?

+0

有帮助的阅读:[如何确定CPU和内存消耗从一个进程?](http://stackoverflow.com/questions/63166/如何确定 - cpu和内存消耗 - 从一个进程内)可能甚至是一个骗局,但没有足够的信心提出近距离投票。 – user4581301

回答

1

官方有两个函数在MSDN中。

  1. GetSystemTimes():它看起来更容易,但很久以前发布。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724400(v=vs.85).aspx

  2. 的GetSystemInfo():我已经得到了示例代码https://code.msdn.microsoft.com/windowsdesktop/Use-PerformanceCounter-to-272d57a1

    DWORD GetProcessorCount() 
    { 
         SYSTEM_INFO sysinfo; 
         DWORD dwNumberOfProcessors; 
         GetSystemInfo(&sysinfo); 
         dwNumberOfProcessors = sysinfo.dwNumberOfProcessors; 
         return dwNumberOfProcessors; 
    } 
    vector<PCTSTR> GetValidCounterNames() 
    { 
        vector<PCTSTR> validCounterNames; 
        DWORD dwNumberOfProcessors = GetProcessorCount(); 
        DWORD index; 
        vector<PCTSTR> vszProcessNames; 
        TCHAR * szCounterName; 
        validCounterNames.push_back(TEXT("\\Processor(_Total)\\% Processor Time")); 
        validCounterNames.push_back(TEXT("\\Processor(_Total)\\% Idle Time")); 
        // skip some codes 
        return validCounterNames; 
    } 
    

祝您好运!

在我看来,Windows命令“tasklist/v”将显示操作系统的CPU TIME和MEMORY,您可以通过'system'或其他函数调用该命令。

PS。我仍然认为在操作系统方面是监视CPU使用情况的最佳方法。 (如果我使用该功能,它也会在内部做同样的事情。)

+0

强烈建议总结链接或提供足够的信息,以便将来的读者在链接崩溃时再次查找内容。 – user4581301

+0

好的你是对的。我在那里添加了一些信息。 –

+0

'tasklist/v'不显示CPU使用率。 “CPU时间”与CPU使用率不同。 – indiv