Qt獲取CPU使用率及內存占用大小

Qt 獲取 CPU 使用率及內存占用大小

文章目錄

  • Qt 獲取 CPU 使用率及內存占用大小
    • 一、簡介
    • 二、關鍵函數
      • 2.1 獲取當前運行程序pid
      • 2.2 通過pid獲取運行時間
      • 2.3 通過pid獲取內存大小
    • 三、具體實現
    • 五、寫在最后

?

一、簡介

近期在使用軟件的過程中發現一個有意思的東西。如下所示:

在這里插入圖片描述

該軟件可以顯示 CPU 使用率及內存大小和內存使用率。感覺比較有意思,于是就想著能不能通過 Qt 自己實現一套這樣的東西,這也是本文的由來。

那么,言歸正傳,本文將介紹 如何使用 Qt 獲取當前軟件的 CPU 使用率及內存大小。本文適合對 Qt 有一些基礎的朋友,對于一些簡單的地方我不會過多贅述,望諒解!!!

另外,本文闡述方法不適用于 Linux,需要注意!!!

首先,我使用的環境如下所示:

  • Windows 10 x64
  • Qt 5.12.3

?

二、關鍵函數

本文專注于解決獲取 Qt 當前運行程序的 CPU 使用率及內存大小,因此本文通過獲取當前運行程序 pid 的形式獲取運行時間,通過運行時間計算得到 CPU 使用率。

2.1 獲取當前運行程序pid

Qt 中,可以通過如下所示的語句獲取當前程序 PID

QApplication::applicationPid();

?

2.2 通過pid獲取運行時間

首先,需要打開進程句柄,需要使用到如下所示的函數:

HANDLE OpenProcess(DWORD dwDesiredAccess,  BOOL  bInheritHandle,   DWORD dwProcessId       
);

其中三個參數意義如下所示:

  • dwDesiredAccess: 進程訪問權限
  • bInheritHandle: 是否允許子進程繼承此句柄,通常設為 FALSE
  • dwProcessId: 目標進程的 PID(進程標識符)

返回值意義如下所示:

  • 成功:返回進程句柄(HANDLE
  • 失敗:返回 NULL,需調用 GetLastError() 獲取錯誤碼

更詳細的解釋在官方網站:OpenProcess 函數 (processthreadsapi.h) - Win32 apps | Microsoft Learn

如若鏈接點擊無法跳轉,可自行復制打開:

  • https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess

其次,我們需要通過 PID 獲取運行時間信息,需要使用到如下所示的函數:

BOOL GetProcessTimes(HANDLE     hProcess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime
);

其參數意義如下所示:

  • hProcess: 進程句柄
  • lpCreationTime: 進程的創建時間
  • lpExitTime: 進程的退出時間
  • lpKernelTime: 內核模式(如系統調用)下消耗的 CPP 時間
  • lpUserTime: 用戶模式(應用程序代碼)下消耗的 CPU 時間

返回參數意義如下所示:

  • 成功:返回 TRUE(非零值)
  • 失敗:返回 FALSE(零值),需調用 GetLastError() 獲取錯誤碼

更詳細的解釋在官方網站:getProcessTimes 函數 (processthreadsapi.h) - Win32 apps | Microsoft Learn

如若鏈接點擊無法跳轉,可自行復制打開:

  • https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesstimes

?

2.3 通過pid獲取內存大小

獲取進程使用內存大小,需要使用如下所示函數:

BOOL GetProcessMemoryInfo(HANDLE            Process,         PPROCESS_MEMORY_COUNTERS ppsmemCounters, DWORD             cb               
);

其參數意義如下所示:

  • Process: 進程句柄
  • ppsmemCounters: 指向 PROCESS_MEMORY_COUNTERS 結構的指針,用于接收內存統計信息
  • cb: 結構體大小,通常設為 sizeof(PROCESS_MEMORY_COUNTERS)

返回參數意義如下所示:

  • 成功:返回 TRUE(非零值)
  • 失敗:返回 FALSE(零值),需調用 GetLastError() 獲取錯誤碼

其中需要注意的是 PROCESS_MEMORY_COUNTERS 結構體,其包含如下所示的成員參數:

typedef struct _PROCESS_MEMORY_COUNTERS {DWORD  cb;                   // 結構體大小DWORD  PageFaultCount;       // 頁面錯誤次數SIZE_T PeakWorkingSetSize;   // 工作集峰值(物理內存)SIZE_T WorkingSetSize;       // 當前工作集大小SIZE_T QuotaPeakPagedPoolUsage; // 分頁池配額峰值SIZE_T QuotaPagedPoolUsage;      // 當前分頁池配額SIZE_T QuotaPeakNonPagedPoolUsage; // 非分頁池配額峰值SIZE_T QuotaNonPagedPoolUsage;    // 當前非分頁池配額SIZE_T PagefileUsage;        // 頁面文件使用量SIZE_T PeakPagefileUsage;     // 頁面文件使用峰值
} PROCESS_MEMORY_COUNTERS;

更詳細的解釋在官方網站:getProcessMemoryInfo 函數 (psapi.h) - Win32 apps | Microsoft Learn

如若鏈接點擊無法跳轉,可自行復制打開:

  • https://learn.microsoft.com/zh-cn/windows/win32/api/psapi/nf-psapi-getprocessmemoryinfo

通過上述三個步驟即可輕松獲取當前運行程序的 CPU 使用率及內存大小。


?

三、具體實現

Qt 中推薦在線程中計算獲取這些信息。因為我們計算方法每 1s 獲取一次時間,計算與前 1s 時間的差值得到 CPU 占用率。如果不適用線程,將會阻塞主線程的執行。

這里我給出示例:

  • cpumontior.h

    #ifndef CPUMONTIOR_H
    #define CPUMONTIOR_H#include "windows.h"
    #include <QObject>
    #include <QThread>
    #include "psapi.h"
    #include <QtMath>class CpuMontior : public QThread
    {Q_OBJECT
    public:explicit CpuMontior(DWORD pid, QObject *parent = nullptr);void setDec(int dec) {this->dec = dec;}protected:void run() override;private:DWORD pid;int dec;// 封裝轉換函數static ULONGLONG filetimeToULONGLONG(const FILETIME *ft) {ULARGE_INTEGER uli;uli.LowPart = ft->dwLowDateTime;uli.HighPart = ft->dwHighDateTime;return uli.QuadPart;}// bytes 單位轉換QString changeFileSize(qint64 fileSize){QStringList units;units << "B" << "KB" << "MB" << "GB" << "TB" << "PB";double mod  = 1024.0;double size = fileSize;//qDebug() << size;int i = 0;long rest = 0;while (size >= mod && i < units.count()-1 ){rest= static_cast<long>(size) % static_cast<long>(mod);size /= mod;i++;}QString szResult = QString::number(qFloor(size));if( rest > 0){szResult += QString(".") + QString::number(rest).left(this->dec);}szResult += units[i];return  szResult;}signals:/* 使用率信息 */void usageInfoSignal(QString cpuUsage, QString memUsage);public slots:
    };#endif // CPUMONTIOR_H
  • cpumontior.cpp

    #include "cpumontior.h"
    #ifdef QT_DEBUG
    #include <QDebug>
    #endif/*!*  @File        : cpumontior.cpp*  @Brief       : 構造函數*  @Details     : None*  @Param       : void*  @Return      : void*  @Author      : Liu Jiahao*  @Date        : 2025-03-28 14:18:10*  @Version     : v1.1*  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved**/
    CpuMontior::CpuMontior(DWORD pid, QObject *parent) :QThread(parent), pid(pid), dec(2)
    {}/*!*  @File        : cpumontior.cpp*  @Brief       : 工作函數*  @Details     : None*  @Param       : void*  @Return      : void*  @Author      : Liu Jiahao*  @Date        : 2025-03-28 14:19:12*  @Version     : v1.1*  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved**/
    void CpuMontior::run()
    {// 獲取系統資源信息HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);if (!hProcess) return;FILETIME creationTime, exitTime, kernelTime, userTime;while (!isInterruptionRequested()) {// 第一次采樣if (!GetProcessTimes(hProcess, &creationTime, &exitTime, &kernelTime, &userTime)) {break;}ULONGLONG kernel1 = filetimeToULONGLONG(&kernelTime);ULONGLONG user1 = filetimeToULONGLONG(&userTime);msleep(1000); // 每秒更新一次// 第二次采樣if (!GetProcessTimes(hProcess, &creationTime, &exitTime, &kernelTime, &userTime)) {break;}ULONGLONG kernel2 = filetimeToULONGLONG(&kernelTime);ULONGLONG user2 = filetimeToULONGLONG(&userTime);// 計算差值ULONGLONG totalTime = (kernel2 - kernel1) + (user2 - user1);double cpuUsage = (totalTime / 10000.0) / 100.0; // 轉換為百分比// 內存使用率PROCESS_MEMORY_COUNTERS pmc;qint64 memoryUsage = 0;if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) {memoryUsage = static_cast<qint64>(pmc.WorkingSetSize); // 單位:字節}// 通過信號發送emit usageInfoSignal(QString::number(cpuUsage, 'f', this->dec) + "%", changeFileSize(memoryUsage));}
    #ifdef QT_DEBUGqDebug() << "quit thread";
    #endifCloseHandle(hProcess);
    }

增加 UI 進行顯示后,效果如下所示:

在這里插入圖片描述

可以說,跟我開頭放的那個圖區別不大。具體的 UI 設計這里不進行贅述,大家可以自行構建。我在函數中使用了 emit usageInfoSignal(QString::number(cpuUsage, 'f', this->dec) + "%", changeFileSize(memoryUsage)); 發送信號,大家可以根據這個信號 connect 槽函數進行實現。


?

五、寫在最后

本文介紹了 如何使用 Qt 獲取當前軟件的 CPU 使用率及內存大小

題外話,現在覺得 AI 已經可以解決大部分遇到的問題,本文代碼部分也借助了 AI 幫助,所有功能并非我原創。其實我也很惋惜,大家可以自行通過 AI 解決這些問題,就不需要在網上到處搜索,那我寫博文似乎也失去了意義… 人工智能的發展不是壞事,只是改變了一些我們思考問題、解決問題的習慣。同時我也并不覺得 csdn 這個平臺有多好,也未經過我同意擅自將我的文章設置為僅VIP可見,這與我初心相悖。隨著工作繁忙,也很少有時間繼續寫下去…漸漸地也沒有了動力。下次更新不知道是什么時候,希望讀者海涵!

歡迎廣大讀者提出問題以及修改意見,本人看到后會給予回應,歡迎留言,后續會逐步進行開源!!!
另外,由于文章是作者手打的文字,有些地方可能文字會出錯,望諒解,也可私信聯系我,我對其進行更改。

  • 個人CSDN賬號:劉梓謙_-CSDN博客

  • Gitee:劉佳豪 (liu-jiahaohappy) - Gitee.com

  • GitHub:Jiahao-Liu29 (github.com)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904778.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

期刊論文寫作注意點

下面給出關于期刊寫作的幾個關鍵注意點 一、摘要突出創新點 最重要的是論文的摘要&#xff0c;因為在論文送審的時候&#xff0c;編輯如果沒有時間&#xff0c;最先看的就是摘要。摘要要寫好。如果投的是頂刊&#xff0c;在摘要里面盡量不要寫是在什么方法的基礎上進行改進之類…

Swagger 3.0 中注解詳細示例

Swagger 3.0 提供了豐富的注解來詳細描述 API 的請求和響應。以下是一個使用 Operation、Parameter、RequestBody 和 ApiResponse 注解的示例&#xff0c;展示了如何設置請求頭、請求參數、路徑變量、請求體和響應體。代碼中未使用 DTO 對象&#xff0c;而是使用 Map 來傳遞參數…

切比雪夫不等式專題習題解析

切比雪夫不等式專題習題解析 前言 本文為概率論習題集專欄的切比雪夫不等式專題習題解析,針對習題篇中的10道題目提供詳細解答。希望通過這些解析幫助大家深入理解切比雪夫不等式的應用和意義。 一、基礎概念題解析 習題1解析: 錯誤。切比雪夫不等式適用于任何具有有限方…

軟件測試的概念

需求的概念 開發模型 測試模型 1. 什么是需求 在多數軟件公司&#xff0c;會有兩部分需求&#xff0c;?部分是??需求&#xff0c;?部分是軟件需求。 1.1 ??需求 ??需求&#xff1a;可以簡單理解為甲?提出的需求&#xff0c;如果沒有甲?&#xff0c;那么就是終端??…

前端面試每日三題 - Day 29

這是我為準備前端/全棧開發工程師面試整理的第29天每日三題練習&#xff1a; ? 題目1&#xff1a;Web Components技術全景解析 核心三要素 Custom Elements&#xff08;自定義元素&#xff09; class MyButton extends HTMLElement {constructor() {super();this.attachShado…

StreamRL:彈性、可擴展、異構的RLHF架構

StreamRL&#xff1a;彈性、可擴展、異構的RLHF架構 大語言模型&#xff08;LLMs&#xff09;的強化學習&#xff08;RL&#xff09;訓練正處于快速發展階段&#xff0c;但現有架構存在諸多問題。本文介紹的StreamRL框架為解決這些難題而來&#xff0c;它通過獨特設計提升了訓…

LVGL的核心:lv_timer_handler

文章目錄 &#x1f9e0; 一句話總結 LVGL 的運行核心&#xff1a;&#x1f501; 1. while(1) 主循環中的 lv_task_handler()?? 2. lv_timer_handler() 定時器調度核心? 并發控制? 關鍵行為流程&#xff1a;&#x1f300; 任務執行邏輯&#xff1a;&#x1f9ee; 計算下一次…

【數據機構】2. 線性表之“順序表”

- 第 96 篇 - Date: 2025 - 05 - 09 Author: 鄭龍浩/仟墨 【數據結構 2】 文章目錄 數據結構 - 2 -線性表之“順序表”1 基本概念2 順序表(一般為數組)① 基本介紹② 分類 (靜態與動態)③ 動態順序表的實現**test.c文件:****SeqList.h文件:****SeqList.c文件:** 數據結構 - 2 …

101 alpha——8 學習

alpha (-1 * rank(((sum(open, 5) * sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)),這里我們操作符都明白&#xff0c;現在來看金融意義 金融意義 里層是這個 (sum(open, 5) * sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)), 10 這里是兩個相減…

auto推導類型原則

auto 是 C11 引入的類型自動推導關鍵字&#xff0c;它允許編譯器根據表達式的類型來推導變量的確切類型。雖然使用 auto 可以讓代碼更簡潔&#xff0c;但理解它的類型推導規則非常關鍵&#xff0c;尤其是在涉及指針、引用、const、模板等場景時。 ? 一、基本推導原則 auto x …

使用智能表格做FMEDA

一、優點 使用智能表格替代excel做FMEDA具備以下優勢&#xff1a; 減少維護成本&#xff08;數據庫關聯&#xff0c;修改方便&#xff09;便于持續優化&#xff08;失效率分布&#xff0c;失效率模型可重復使用&#xff09;多人同步編寫&#xff08;同時操作&#xff0c;同步…

IP協議.

IP 協議是互聯網的核心協議&#xff0c;工作在網絡層。它給網絡中的設備分配唯一的 IP 地址&#xff0c;把上層數據封裝成數據包&#xff0c;然后根據目的 IP 地址通過路由器等設備進行轉發&#xff0c;實現數據在不同網絡間的傳輸。它還能在必要時對數據包進行分片和重組&…

archlinux 詳解系統層面

Arch Linux 深度解析&#xff1a;從設計哲學到系統架構 一、Arch Linux 概述&#xff1a;滾動發行的極客之選 Arch Linux 是一款以 滾動更新&#xff08;Rolling Release&#xff09; 為核心特性的 Linux 發行版&#xff0c;強調 輕量、靈活、高度可定制&#xff0c;旨在讓用…

HTML8:媒體元素

視頻和音頻 視頻元素 video 音頻 audio <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>媒體元素學習</title> </head> <body> <!--音頻和視頻 src:資源路徑 controls:控制條…

SpringBoot3集成Oauth2——1(/oauth2/token方法的升級踩坑)

備注&#xff1a;本文適用于你在SpringBoot2.7以前集成過oauth2&#xff0c;并且項目已經正式投入使用的情況&#xff0c;否則&#xff0c;我建議你直接學習或者找資料學習最新的oauth2集成&#xff0c;就不要糾結于老版本的oauth2。 原因&#xff1a;Spring Security 5.x和Sp…

筆記本電腦實現網線內網 + Wi-Fi外網同時使用的配置方案

1、同時連接兩個網絡? 插入網線連接內網&#xff0c;確保內網IP地址正常獲取&#xff08;如10.143.88.x&#xff09;&#xff1b;連接Wi-Fi接入外網&#xff0c;確認可正常訪問互聯網&#xff08;如網關為192.168.8.1&#xff09;。 2、 記錄關鍵網絡參數? 內網網關&#…

從韋斯利?卡普洛看北斗星咨詢公司的技術咨詢引領之路

在科技與商業深度交融的時代&#xff0c;技術咨詢公司扮演著舉足輕重的角色&#xff0c;它們宛如連接技術創新與企業實際需求的橋梁&#xff0c;助力企業在復雜多變的市場環境中找準技術發展方向&#xff0c;實現可持續增長。《對話 CTO&#xff0c;駕馭高科技浪潮》的第 5 章聚…

首版次軟件測試的內容有哪些?首版次軟件質量影響因素是什么?

首版次軟件測試不僅是簡單的“找錯”&#xff0c;更是系統地驗證和評估軟件各項功能和性能指標是否符合設計標準。 一、首版次軟件測試常見的測試內容   1.功能測試&#xff1a;對照需求文檔&#xff0c;確認功能模塊是否按預期實現&#xff0c;用戶操作流程是否順暢。   …

從零開始的python學習(六)P86+P87+P88

本文章記錄觀看B站python教程學習筆記和實踐感悟&#xff0c;視頻鏈接&#xff1a;【花了2萬多買的Python教程全套&#xff0c;現在分享給大家&#xff0c;入門到精通(Python全棧開發教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…

從設計到開發,原型標注圖全流程標準化

一、原型標注圖是什么&#xff1f; 原型標注圖&#xff08;Annotated Prototype&#xff09;是設計原型&#xff08;Prototype&#xff09;的詳細說明書&#xff0c;通過圖文結合的方式&#xff0c;將設計稿中的視覺樣式、交互邏輯、適配規則等技術細節轉化為開發可理解的標準…