C/C++獲取Windows平臺(tái)CPU占用率的方法
一、主要接口
PdhOpenQueryA函數(shù)
此函數(shù)主要作用是:創(chuàng)建從實(shí)時(shí)源或日志文件收集性能數(shù)據(jù)的新查詢,返回在后續(xù) PDH 函數(shù)調(diào)用中使用的查詢的句柄。
PdhAddCounterA函數(shù)
此函數(shù)主要功能為:將指定的計(jì)數(shù)器添加到查詢。
PdhCollectQueryData函數(shù)
此函數(shù)主要功能為:收集指定查詢中所有計(jì)數(shù)器的當(dāng)前原始數(shù)據(jù)值,并更新每個(gè)計(jì)數(shù)器的狀態(tài)代碼。 有的數(shù)據(jù)需要兩個(gè)樣本數(shù)據(jù),所以一般步驟為:
- 調(diào)用 PdhCollectQueryData 以收集第一個(gè)樣本。
- 調(diào)用 Sleep 函數(shù)以在集合之間至少等待一秒。
- 再次調(diào)用 PdhCollectQueryData 以收集第二個(gè)樣本。
- 調(diào)用 PdhGetFormattedCounterValue 函數(shù)以計(jì)算可顯示的值。
- 重復(fù)步驟 2 到 4。
PdhGetFormattedCounterValue函數(shù)
此函數(shù)主要功能為:計(jì)算指定計(jì)數(shù)器的可顯示值。
大體的邏輯是:創(chuàng)建句柄->添加計(jì)數(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個(gè)取樣值 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; // 從第一個(gè)取樣值開(kāi)始 DWORD dwNumEntries = NUM; // 一共10個(gè)取樣值 PDH_STATISTICS stat; // 計(jì)算統(tǒng)計(jì)信息 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ù)使用計(jì)數(shù)器數(shù)據(jù) - Win32 apps | Microsoft Learn
Ps:以上代碼使用的是% Idle Time (處理器在采樣期間空閑的時(shí)間的百分比),因?yàn)槲腋杏X(jué)這個(gè)比% Processor Time (處理器用來(lái)執(zhí)行非閑置線程時(shí)間的百分比)更準(zhǔn)確,可以自行用100減掉。
以上就是C/C++獲取Windows平臺(tái)CPU占用率的方法的詳細(xì)內(nèi)容,更多關(guān)于C/C++獲取Windows CPU占用率的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ OpenCV實(shí)戰(zhàn)之制作九宮格圖像
本文將為大家介紹如何使用OpenCV C++ 制作九宮格圖像,即將一張圖像均等分成九份,然后將這九個(gè)小塊按一定間隔拷貝到新畫布上就可以啦。感興趣的可以動(dòng)手試一試2022-01-01C++利用opencv實(shí)現(xiàn)單目測(cè)距的實(shí)現(xiàn)示例
本文主要介紹了C++利用opencv實(shí)現(xiàn)單目測(cè)距的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C++的get()函數(shù)與getline()函數(shù)使用詳解
這篇文章主要介紹了C++的get()函數(shù)與getline()函數(shù)使用詳解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制
這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01關(guān)于虛函數(shù)實(shí)現(xiàn)多態(tài)的原理及分析
這篇文章主要介紹了C++中如何實(shí)現(xiàn)多態(tài)問(wèn)題,具有很好的參考價(jià)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02C語(yǔ)言中volatile關(guān)鍵字的深入講解
在程序設(shè)計(jì)中,尤其是在C語(yǔ)言、C++、C#和Java語(yǔ)言中,使用volatile關(guān)鍵字聲明的變量或?qū)ο笸ǔ>哂信c優(yōu)化、多線程相關(guān)的特殊屬性,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言volatile關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07