Qt 获取 CPU 使用率及内存占用大小
一、简介
近期在使用软件的过程中发现一个有意思的东西。如下所示:

该软件可以显示 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: 是否允许子进程继承此句柄,通常设为FALSEdwProcessId: 目标进程的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

最低0.47元/天 解锁文章
1925

被折叠的 条评论
为什么被折叠?



