项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)
需求
使用Qt软件开发一个检测cpu温度的功能。
兼容windows、linux,国产麒麟系统(同为linux)
windows上运行(需要管理员权限):
国产麒麟操作上运行(需要管理员权限):
- windows上定时检测输出cpu温度。
- linux上定时检测输出cpu温度。
- 国产银河麒麟操作系统上输出cpu温度。
#ifndef LINUX
QString cmd = QString("wmic /namespace:\\\\root\\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature");
QProcess process;
process.start(cmd);
process.waitForFinished();
QString result = process.readAllStandardOutput();
LOG << result;
result = result.replace("\r", "");
LOG << result;
QStringList list = result.split("\n", QString::SkipEmptyParts);
LOG << list;
bool ok = false;
int t = 0;
for(int index = 0; index < list.size(); index++)
{
QString str = list.at(index);
str = str.trimmed();
LOG << str;
t = str.toInt(&ok);
if(ok)
{
break;
}
}
// false失败
if(!ok)
{
emit signal_detectTemperature(false, _t);
// 下一次检测
QTimer::singleShot(_intervalMs, this, SLOT(slot_loop()));
return;
}
// 转换
_t = (t - 2732) * 1.0f / 10;
// 抛出温度
emit signal_detectTemperature(true, _t);
#else
// sensors,有些电脑可能没安装,安装方法如下:
// sudo apt-get install lm-sensors hddtemp
// sudo sensors-detect
// sensors
QProcess process;
process.start("sensors");
process.waitForFinished();
QString result = process.readAllStandardOutput();
LOG << result;
result = result.replace("\r","");
LOG << result;
bool ok = false;
QStringList list = result.split("\n", QString::SkipEmptyParts);
LOG << list;
#if 1
for(int index = 0; index < list.size(); index++)
{
QString str = list.at(index);
// 注意:
// 1.虚拟机是无法获取温度的
// Physical id 0: +39.0°C (high = +80.0°C, crit = +100.0°C)
// Core 0: +33.0°C (high = +80.0°C, crit = +100.0°C)
// Core 1: +35.0°C (high = +80.0°C, crit = +100.0°C)
// Core 2: +36.0°C (high = +80.0°C, crit = +100.0°C)
// Core 3: +39.0°C (high = +80.0°C, crit = +100.0°C)
if(str.contains("Core 0"))
{
LOG << str;
QStringList subList = str.split(" ", QString::SkipEmptyParts);
LOG << subList;
if(subList.size() > 3)
{
QString s = subList.at(2);
// ("Core", "0:", "+33.0°C", "(high", "=", "+80.0°C,", "crit", "=", "+100.0°C)")
if(s.startsWith("+") && s.endsWith("°C"))
{
_t = s.mid(1, s.size() - 1 - 2).toDouble(&ok);
}
}
break;
}
}
#else
QString str = "Core 0: +33.2°C (high = +80.0°C, crit = +100.0°C)";
if(str.contains("Core 0"))
{
LOG << str;
QStringList subList = str.split(" ", QString::SkipEmptyParts);
LOG << subList;
if(subList.size() > 3)
{
QString s = subList.at(2);
// ("Core", "0:", "+33.0°C", "(high", "=", "+80.0°C,", "crit", "=", "+100.0°C)")
if(s.startsWith("+") && s.endsWith("°C"))
{
_t = s.mid(1, s.size() - 1 - 2).toDouble(&ok);
}
}
}
#endif
// false失败
if(!ok)
{
emit signal_detectTemperature(false, _t);
// 下一次检测
QTimer::singleShot(_intervalMs, this, SLOT(slot_loop()));
return;
}
// 抛出温度
emit signal_detectTemperature(true, _t);
#endif
#endif
win10获取系统设备相关信息,需要管理员权限。
发布时:1.点击exe右键,使用管理员运行。
发布时/开发时:1.可以直接exe鼠标右键属性,勾选管理员权限运行,后面开发就可以了。
开发时:2.开发的时候,可以直接使用管理员权限打开QtCreator即可。
没有传感器输出:
因为是使用虚拟机上开发,实际是没有传感器等一些数据的,都是No。(注意:直接开发ubuntu驱动时,查看操作系统上设备树,所有寄存器地址都是0x0000000,也是一样的道理,与硬件相关的,虚拟机是模拟的,没有实际)
重新装了一台物理麒麟机,测试可以。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?