Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致
一、前言
在很多软件上,会在某个部位显示一个部件,专门显示当前的CPU使用率以及内存占用,方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用,在不用打开任务管理器或者资源查看器的时候直接得知当前系统的运行情况。尤其是视频监控系统,如果64路全开,肯定很占用CPU和内存情况,这样直接在软件上直观的查看到当前占用率,用户更方便判断当前电脑环境是否适合打开多少路通道。
采集本地系统的实时CPU使用率,如果使用的GetSystemTimes函数,会发现和本地任务管理器中的不一致(主要集中在win10系统/win7和XP系统貌似正常),那是因为计数统计的方式不一样,采用GetSystemTimes函数获取到的值相对来说是系统底层的数据。为了能够和任务管理器中展示的一致,试验过各种办法后决定采用命令行获取的形式处理,这样获取到的值是一致的,在win10以下的系统执行 typeperf “\Processor(_Total)\% Processor Time”,在win10及以上的系统执行 typeperf “\Processor Information(_Total)\% Processor Utility”。执行命令采用QProcess类,执行结果有信号通知,直接读取解析即可。同理在linux系统上也是采用执行命令行的形式获取,比如linux上获取CPU占用命令是 cat /proc/stat,获取内存相关命令是 cat /proc/meminfo。在windows上获取内存相关使用函数 GlobalMemoryStatusEx。
二、主要功能
- 实时显示当前CPU占用率。
- 实时显示内存使用情况。
- 包括共多少内存、已使用多少内存。
- 全平台通用,包括windows、linux、ARM。
- 发出信号通知占用率和内存使用情况等,以便自行显示到其他地方。
三、效果图
四、开源主页
- 以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
- 本开源项目已经成功升级到V2.0版本,分门别类,图文并茂,保你爽到爆。
- Qt开源武林秘籍开发经验,看完学完,20K起薪,没有找我!
- 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
- 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
- 开源秘籍:https://gitee.com/feiyangqingyun/qtkaifajingyan
- 个人主页:https://qtchina.blog.csdn.net/
- 视频主页:https://space.bilibili.com/687803542
五、核心代码
#pragma execution_character_set("utf-8")#include "cpumemorylabel.h"
#include "qtimer.h"
#include "qprocess.h"
#include "qdebug.h"#ifdef Q_OS_WIN
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x502
#endif
#include "windows.h"
#endif#define MB (1024 * 1024)
#define KB (1024)CpuMemoryLabel::CpuMemoryLabel(QWidget *parent) : QLabel(parent)
{totalNew = idleNew = totalOld = idleOld = 0;cpuPercent = 0;memoryPercent = 0;memoryAll = 0;memoryUse = 0;//获取CPU占用情况定时器timerCPU = new QTimer(this);connect(timerCPU, SIGNAL(timeout()), this, SLOT(getCPU()));//获取内存占用情况定时器timerMemory = new QTimer(this);connect(timerMemory, SIGNAL(timeout()), this, SLOT(getMemory()));//执行命令获取process = new QProcess(this);connect(process, SIGNAL(readyRead()), this, SLOT(readData()));showText = true;
}CpuMemoryLabel::~CpuMemoryLabel()
{this->stop();
}void CpuMemoryLabel::start(int interval)
{this->getCPU();this->getMemory();if (!timerCPU->isActive()) {timerCPU->start(interval);}if (!timerMemory->isActive()) {timerMemory->start(interval + 1000);}
}void CpuMemoryLabel::stop()
{process->close();if (timerCPU->isActive()) {timerCPU->stop();}if (timerMemory->isActive()) {timerMemory->stop();}
}void CpuMemoryLabel::getCPU()
{
#ifdef Q_OS_WIN
#if 0static FILETIME lastIdleTime;static FILETIME lastKernelTime;static FILETIME lastUserTime;FILETIME newIdleTime;FILETIME newKernelTime;FILETIME newUserTime;//采用GetSystemTimes获取的CPU占用和任务管理器的不一致GetSystemTimes(&newIdleTime, &newKernelTime, &newUserTime);int offset = 31;quint64 a, b;quint64 idle, kernel, user;a = (lastIdleTime.dwHighDateTime << offset) | lastIdleTime.dwLowDateTime;b = (newIdleTime.dwHighDateTime << offset) | newIdleTime.dwLowDateTime;idle = b - a;a = (lastKernelTime.dwHighDateTime << offset) | lastKernelTime.dwLowDateTime;b = (newKernelTime.dwHighDateTime << offset) | newKernelTime.dwLowDateTime;kernel = b - a;a = (lastUserTime.dwHighDateTime << offset) | lastUserTime.dwLowDateTime;b = (newUserTime.dwHighDateTime << offset) | newUserTime.dwLowDateTime;user = b - a;cpuPercent = float(kernel + user - idle) * 100 / float(kernel + user);lastIdleTime = newIdleTime;lastKernelTime = newKernelTime;lastUserTime = newUserTime;this->setData();
#else//获取系统版本区分win10bool win10 = false;
#if (QT_VERSION >= QT_VERSION_CHECK(5,4,0))win10 = (QSysInfo::productVersion().mid(0, 2).toInt() >= 10);
#elsewin10 = (QSysInfo::WindowsVersion >= 192);
#endifQString cmd = "\\Processor(_Total)\\% Processor Time";if (win10) {cmd = "\\Processor Information(_Total)\\% Processor Utility";}if (process->state() == QProcess::NotRunning) {process->start("typeperf", QStringList() << cmd);}
#endif#elif defined(Q_OS_UNIX) && !defined(Q_OS_WASM)if (process->state() == QProcess::NotRunning) {totalNew = idleNew = 0;process->start("cat", QStringList() << "/proc/stat");}
#endif
}void CpuMemoryLabel::getMemory()
{
#ifdef Q_OS_WINMEMORYSTATUSEX statex;statex.dwLength = sizeof(statex);GlobalMemoryStatusEx(&statex);memoryPercent = statex.dwMemoryLoad;memoryAll = statex.ullTotalPhys / MB;memoryFree = statex.ullAvailPhys / MB;memoryUse = memoryAll - memoryFree;this->setData();#elif defined(Q_OS_UNIX) && !defined(Q_OS_WASM)if (process->state() == QProcess::NotRunning) {process->start("cat", QStringList() << "/proc/meminfo");}
#endif
}void CpuMemoryLabel::readData()
{
#ifdef Q_OS_WINwhile (!process->atEnd()) {QString s = QLatin1String(process->readLine());s = s.split(",").last();s.replace("\r", "");s.replace("\n", "");s.replace("\"", "");if (!s.isEmpty() && s.length() < 10) {cpuPercent = qRound(s.toFloat());}}
#elif defined(Q_OS_UNIX) && !defined(Q_OS_WASM)while (!process->atEnd()) {QString s = QLatin1String(process->readLine());if (s.startsWith("cpu")) {QStringList list = s.split(" ");idleNew = list.at(5).toUInt();foreach (QString value, list) {totalNew += value.toUInt();}quint64 total = totalNew - totalOld;quint64 idle = idleNew - idleOld;cpuPercent = 100 * (total - idle) / total;totalOld = totalNew;idleOld = idleNew;break;} else if (s.startsWith("MemTotal")) {s.replace(" ", "");s = s.split(":").at(1);memoryAll = s.left(s.length() - 3).toUInt() / KB;} else if (s.startsWith("MemFree")) {s.replace(" ", "");s = s.split(":").at(1);memoryFree = s.left(s.length() - 3).toUInt() / KB;} else if (s.startsWith("Buffers")) {s.replace(" ", "");s = s.split(":").at(1);memoryFree += s.left(s.length() - 3).toUInt() / KB;} else if (s.startsWith("Cached")) {s.replace(" ", "");s = s.split(":").at(1);memoryFree += s.left(s.length() - 3).toUInt() / KB;memoryUse = memoryAll - memoryFree;memoryPercent = 100 * memoryUse / memoryAll;break;}}
#endifthis->setData();
}void CpuMemoryLabel::setData()
{cpuPercent = (cpuPercent < 0 ? 0 : cpuPercent);cpuPercent = (cpuPercent > 100 ? 0 : cpuPercent);QString msg = QString("CPU %1% Mem %2% ( 已用 %3 MB / 共 %4 MB )").arg(cpuPercent).arg(memoryPercent).arg(memoryUse).arg(memoryAll);if (showText) {this->setText(msg);}emit textChanged(msg);emit valueChanged(cpuPercent, memoryPercent, memoryAll, memoryUse, memoryFree);
}QSize CpuMemoryLabel::sizeHint() const
{return QSize(300, 30);
}QSize CpuMemoryLabel::minimumSizeHint() const
{return QSize(30, 10);
}bool CpuMemoryLabel::getShowText() const
{return this->showText;
}void CpuMemoryLabel::setShowText(bool showText)
{this->showText = showText;
}
相关文章:

Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致
一、前言 在很多软件上,会在某个部位显示一个部件,专门显示当前的CPU使用率以及内存占用,方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用,在不用打开任务管理器或者资源查看器的时候直接得知当前系统的…...

win32汇编-使用子程序
当程序中相同功能的一段代码用得比较频繁时,可以将它分离出来写成一个子程序,在主程序中用call指令来调用它。这样可以不用重复写相同的代码, 仅仅用call指令就可以完成多次同样的工作了。Win 32汇编中的子程序也采用堆栈来传递参数ÿ…...

【论文阅读】 Cola-Dif; An explainable task-specific synthesis network
文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…...

ShareMouse for Mac(多台电脑鼠标键盘共享软件)
ShareMouse mac版是一款Mac平台上可以在多台电脑间共享鼠标的工具软件,sharemousefor Mac支持 Windows 与 Mac,并可以在不同电脑间共享剪贴板。只需要移动鼠标指针的到想控制的显示器那里去、鼠标光标就会神奇地“跨越”到邻近的电脑屏幕上。每个计算机都…...

中文编程开发语言工具开发案例:多种称重方式编程实际例子
中文编程开发语言工具开发案例:多种称重方式编程实际例子 上图为 计价秤,使用串口通讯线连接电脑的主机,软件自动读取称的重量,自动计算金额。这种方式称重快速,不需再打印条码。 上图这个称重方式为 一体称称重&#…...
国密sm2的Vue、Python、Java互通使用
目录 一、Vue 二、Python 三、Java 一、Vue # npm install --save sm-cryptoimport {sm2} from sm-crypto const cipherMode 1 const private_key d9d37f4f46e8514c6f9398a984e74f3eead994e8f4ac5f92e5deb313cb5ad6a6 const public_key 04 e332ee43ac37be458550652fb9…...

如何通过SK集成chatGPT实现DotNet项目工程化?
智能助手服务 以下案例将讲解如何实现天气插件 当前文档对应src/assistant/Chat.SemanticServer项目 首先我们介绍一下Chat.SemanticServer的技术架构 SemanticKernel 是什么? Semantic Kernel是一个SDK,它将OpenAI、Azure OpenAI和Hugging Face等大…...
DRM中render-node编号的分配
DRM系统 DRM是direct rendering manager的简称。DRM是linux kernel中与负责video cards功能的GPU打交道的子系统。DRM给出了一组API,可以供用户程序来发送命令和数据给GPU设备从而来控制比如display、render等功能。 render-node由来 在以前,DRM子系统…...

将输入对象转换为数组数组的维度大于等于1numpy.atleast_1d()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将输入对象转换为数组 数组的维度大于等于1 numpy.atleast_1d() 选择题 使用numpy.atleast_1d()函数,下列正确的是? import numpy as np a1 1 a2 ((1,2,3),(4,5,6)) print("…...
js 删除树状图无用数据,如果子级没有数据则删除
有一个需求,当你从后端拿到一个树状图的时候,有些子级没数据,这时就需要我们处理一下数据,当然了,如果第一层底下的第二层没数据,第二层底下的所有都没数据,那这一层都不需要。 我的写法&#x…...

Docker 容器化(初学者的分享)
目录 一、什么是docker 二、docker的缺陷 三、简单的操作 一、首先配置一台虚拟机 二、安装Docker-CE 一、安装utils 二、 将 Docker 的软件源添加到 CentOS 的 yum 仓库中。这样可以通过 yum 命令来安装、更新和管理 Docker 相关的软件包。 三、将 download.docker.co…...
LCS 01.下载插件
题目来源: leetcode题目,网址:写文章-CSDN创作中心 解题思路: 假设需要 n 分钟下载插件,前 n-1 分钟将带宽加倍,最后一分钟下载时总时间最少。 解题代码: class Solution { public:int l…...

架构-设计原则
1、面向对象的SOLID 1.1 概述 SOLID是5个设计原则开头字母的缩写,其本身就有“稳定的”的意思,寓意是“遵从SOLID原则可以建立稳定、灵活、健壮的系统”。5个原则分别如下: Single Responsibility Principle(SRP)&am…...

在 Python 3 中释放 LightGBM 的力量:您的机器学习大师之路
机器学习是 Python 占据主导地位的领域,它一直在给全球各行各业带来革命性的变化。要在这个不断变化的环境中脱颖而出,掌握正确的工具是关键。LightGBM 就是这样一个工具,它是一个强大且快速的梯度提升框架。在这份综合指南中,我们将通过实际示例和示例数据集从基础知识到高…...

Spring学习笔记(2)
Spring学习笔记(2) 一、Spring配置非定义Bean1.1 DruidDataSource1.2、Connection1.3、Date1.4、SqlSessionFactory 二、Bean实例化的基本流程2.1 BeanDefinition2.2 单例池和流程总结 三、Spring的bean工厂后处理器3.1 bean工厂后处理器入门3.2、注册Be…...
cmd使用ssh连接Linux脚本
前言 在开发过程中,由于MobaXterm,我不知道怎么分页(不是屏内分页),用crtlTab,用起来不习惯,主要是MobaXterm连接了多个服务器,切换起来很麻烦。我是比较习惯使用altTab,…...

Python万圣节蝙蝠
目录 系列文章 前言 蝙蝠 程序设计 程序分析 运行结果 尾声 系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want5…...

TCP流套接字编程
文章目录 前言TCP 和 UDP 的特点对比TcpEchoServer 服务端实现1. 创建 ServerSocket 类实现通信双方建立连接2. 取出建立的连接实现双方通信3. 服务端业务逻辑实现关闭资源服务端整体代码 TcpEchoClient 客户端实现1. 创建出 Socket 对象来与服务端实现通信2. 实现客户端的主要…...
Python迭代器创建与使用:从入门到精通
一、可迭代对象 1、 什么是可迭代对象? 表示可以逐一迭代或者遍历的对象,序列:列表、元组、集合、字符串。非序列:字典、文件。自定义对象:实现了__iter__()方法的对象;实现了使用整数索引的 getitem()方…...

mac虚拟机安装homebrew时的问题
安装了mac虚拟机,结果在需要通过“brew install svn”安装svn时,才注意到没有下载安装homebrew。 于是便想着先安装homebrew,网上查的教程大多是通过类似以下命令 “ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)” 但是都会出现…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...