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。

二、主要功能

  1. 实时显示当前CPU占用率。
  2. 实时显示内存使用情况。
  3. 包括共多少内存、已使用多少内存。
  4. 全平台通用,包括windows、linux、ARM。
  5. 发出信号通知占用率和内存使用情况等,以便自行显示到其他地方。

三、效果图

在这里插入图片描述

四、开源主页

  • 以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
  • 本开源项目已经成功升级到V2.0版本,分门别类,图文并茂,保你爽到爆。
  • Qt开源武林秘籍开发经验,看完学完,20K起薪,没有找我!
  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 开源秘籍:https://gitee.com/feiyangqingyun/qtkaifajingyan
  4. 个人主页:https://qtchina.blog.csdn.net/
  5. 视频主页: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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/140628.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KT6368A的封装怎么画 原理图怎么画 资料怎么看 怎么下载呢

一、简介 KT6368A的封装怎么画 原理图怎么画 资料怎么看 怎么下载呢 也有好几个客户问我们这样的问题&#xff0c;实在是太难了 但是没办法&#xff0c;客户就是上帝&#xff0c;也只能选择认真的回答&#xff0c; 这里对这类型的问题进行统一精细化回复&#xff0c;高手请…

C++前缀和算法应用:和至少为 K 的最短子数组的原理、源码及测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;找出 nums 中和至少为 k 的 最短非空子数组 &#xff0c;并返回该子数组的长度。如果不存在这样的 子数组 &a…

2023年【建筑架子工(建筑特殊工种)】考试内容及建筑架子工(建筑特殊工种)找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 建筑架子工(建筑特殊工种)考试内容是安全生产模拟考试一点通生成的&#xff0c;建筑架子工(建筑特殊工种)证模拟考试题库是根据建筑架子工(建筑特殊工种)最新版教材汇编出建筑架子工(建筑特殊工种)仿真模拟考试。2023…

Mybatis对数据库进行增删查改以及单元测试

这篇写的草率了&#xff0c;是好几天前学到&#xff0c;以后用来自己复习 UserInfo import lombok.Data;Data public class UserInfo {private int id;private String name;private int age;private String email;//LocalDateTime可用于接收 时间}Mapper UserMapper pack…

Python-flask高级使用

文章目录 一.Python-flask使用数据库第一步&#xff1a;首先安装包安装 flask-sqlalchemy (用于ORM&#xff09;&#xff1a;安装 flask-migrate (用于数据迁移)&#xff1a;安装 pymysql (MySQL驱动)&#xff1a; 第二步:在__init__ 配置第三步&#xff1a;插件管理第一步&…

react+ts手写cron表达式转换组件

前言 最近在写的一个分布式调度系统&#xff0c;后端同学需要让我传入cron表达式&#xff0c;给调度接口传参。我去了学习了解了cron表达式的用法&#xff0c;发现有3个通用的表达式刚好符合我们的需求&#xff1a; 需求 每天 xx 的时间&#xff1a; 0 11 20 * * ? 上面是…

通过内网穿透技术实现USB设备共享(USB Redirector)逆向共享

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序&#xff0c;它提供了共享和访问本地或互联网上的U…

Python 机器学习入门之K-Means聚类算法

系列文章目录 第一章 Python 机器学习入门之线性回归 K-Means聚类算法 系列文章目录前言一、K-Means简介1、定义2、例子3、K-Means与KNN 二、 K-Means实现1、步骤2、优化2.1 初始化优化之K-Means2.2 距离优化之elkan K-Means 三、优缺点1、优点2、缺点 前言 学完K近邻算法&a…

【Java 进阶篇】JavaScript 动态表格案例

在这篇博客中&#xff0c;我们将深入了解JavaScript如何创建和操作动态表格。我们将从头开始构建一个动态表格&#xff0c;并逐步添加各种功能&#xff0c;使其能够实现数据的添加、删除和编辑。这个示例将有助于理解如何在前端开发中使用JavaScript创建交互性强大的表格。 准…

Linux | vim的入门手册

目录 前言 一、什么是vim 二、vim编辑器的模式 1、插入模式 &#xff08;1&#xff09;用vim打开文件 &#xff08;2&#xff09;进入插入模式 2、默认模式 &#xff08;1&#xff09;光标移动 &#xff08;2&#xff09;复制、粘贴与剪切操作 &#xff08;3&#x…

uniapp checkbox样式失效,选中框选中按钮不显示

找了很多方法 最后网上一个博主找到了解决方法 在项目的main.css里面 如果你不知道你的css样式在哪个文件夹 直接全局搜索‘ 找到注释两个地方 第一个 checkbox::before 找到这一行 注释箭头指的地方就可以 第二个 checkbox .uni-checkbox-input::before, 注释这两个地方…

垃圾邮件(短信)分类算法实现 机器学习 深度学习 计算机竞赛

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…