2017-04-11 108 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