C/C++獲取Windows平臺CPU占用率的方法
一、主要接口
PdhOpenQueryA函數(shù)
此函數(shù)主要作用是:創(chuàng)建從實時源或日志文件收集性能數(shù)據(jù)的新查詢,返回在后續(xù) PDH 函數(shù)調(diào)用中使用的查詢的句柄。
PdhAddCounterA函數(shù)
此函數(shù)主要功能為:將指定的計數(shù)器添加到查詢。
PdhCollectQueryData函數(shù)
此函數(shù)主要功能為:收集指定查詢中所有計數(shù)器的當(dāng)前原始數(shù)據(jù)值,并更新每個計數(shù)器的狀態(tài)代碼。 有的數(shù)據(jù)需要兩個樣本數(shù)據(jù),所以一般步驟為:
- 調(diào)用 PdhCollectQueryData 以收集第一個樣本。
- 調(diào)用 Sleep 函數(shù)以在集合之間至少等待一秒。
- 再次調(diào)用 PdhCollectQueryData 以收集第二個樣本。
- 調(diào)用 PdhGetFormattedCounterValue 函數(shù)以計算可顯示的值。
- 重復(fù)步驟 2 到 4。
PdhGetFormattedCounterValue函數(shù)
此函數(shù)主要功能為:計算指定計數(shù)器的可顯示值。
大體的邏輯是:創(chuàng)建句柄->添加計數(shù)器->收集數(shù)據(jù)->顯示數(shù)據(jù)
以下是參考代碼:
#include <pdh.h> #pragma comment(lib, "Pdh.lib") PDH_STATUS status; PDH_HQUERY query; PDH_HCOUNTER counter; status = PdhOpenQueryA(NULL, 0, &query); if (status != ERROR_SUCCESS) { return; } status = PdhAddCounterA(query, "\\Processor(_Total)\\% Idle Time", 0, &counter); if (status != ERROR_SUCCESS) { PdhCloseQuery(query); return; } const int NUM = 10; PdhCollectQueryData(query); PDH_RAW_COUNTER rawValueArray[NUM]; // 假設(shè)有00個取樣值 for (int i = 0; i < NUM; i++) { Sleep(1000); //阻塞1s PdhCollectQueryData(query); PDH_FMT_COUNTERVALUE value; PdhGetRawCounterValue(counter, 0, &rawValueArray[i]); status = PdhGetFormattedCounterValue(counter, PDH_FMT_DOUBLE, NULL, &value); if (status == ERROR_SUCCESS) { printf("getCpuPercenage: %.2f%\n", value.doubleValue); } else { std::cout << "Error:" << status; } } DWORD dwFirstEntry = 0; // 從第一個取樣值開始 DWORD dwNumEntries = NUM; // 一共10個取樣值 PDH_STATISTICS stat; // 計算統(tǒng)計信息 status = PdhComputeCounterStatistics(counter, PDH_FMT_DOUBLE, dwFirstEntry, dwNumEntries, rawValueArray, &stat); if (status == ERROR_SUCCESS) { printf("Average: %f\n", stat.mean.doubleValue); printf("Minimum: %f\n", stat.min.doubleValue); printf("Maximum: %f\n", stat.max.doubleValue); } else { printf("Failed to compute counter statistics: %d\n", status); } PdhCloseQuery(query);
附上參考鏈接:使用 PDH 函數(shù)使用計數(shù)器數(shù)據(jù) - Win32 apps | Microsoft Learn
Ps:以上代碼使用的是% Idle Time (處理器在采樣期間空閑的時間的百分比),因為我感覺這個比% Processor Time (處理器用來執(zhí)行非閑置線程時間的百分比)更準(zhǔn)確,可以自行用100減掉。
以上就是C/C++獲取Windows平臺CPU占用率的方法的詳細內(nèi)容,更多關(guān)于C/C++獲取Windows CPU占用率的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++利用opencv實現(xiàn)單目測距的實現(xiàn)示例
本文主要介紹了C++利用opencv實現(xiàn)單目測距的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11C++的get()函數(shù)與getline()函數(shù)使用詳解
這篇文章主要介紹了C++的get()函數(shù)與getline()函數(shù)使用詳解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09關(guān)于虛函數(shù)實現(xiàn)多態(tài)的原理及分析
這篇文章主要介紹了C++中如何實現(xiàn)多態(tài)問題,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02C++實現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹)
這篇文章主要介紹了C++實現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07