项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

需求

  使用 Qt 软件开发一个检测 cpu 温度的功能。
  兼容 windows、linux,国产麒麟系统(同为 linux)

Demo

  windows 上运行 ( 需要管理员权限):
  在这里插入图片描述

  国产麒麟操作上运行(需要管理员权限):
  在这里插入图片描述

 

功能描述 v1.1.0

  • windows 上定时检测输出 cpu 温度。
  • linux 上定时检测输出 cpu 温度。
  • 国产银河麒麟操作系统上输出 cpu 温度。
 

模块化部署

  在这里插入图片描述

 

关键源码

#ifndef LINUX
    QString cmd = QString("wmic /namespace:\\\\root\\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature");
QProcess process;
process.<span class="hljs-built_in">start</span>(cmd);
process.<span class="hljs-built_in">waitForFinished</span>();

QString result = process.<span class="hljs-built_in">readAllStandardOutput</span>();
LOG &lt;&lt; result;

result = result.<span class="hljs-built_in">replace</span>(<span class="hljs-string">"\r"</span>, <span class="hljs-string">""</span>);
LOG &lt;&lt; result;

QStringList list = result.<span class="hljs-built_in">split</span>(<span class="hljs-string">"\n"</span>, QString::SkipEmptyParts);
LOG &lt;&lt; list;

<span class="hljs-type">bool</span> ok = <span class="hljs-literal">false</span>;
<span class="hljs-type">int</span> t = <span class="hljs-number">0</span>;
<span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> index = <span class="hljs-number">0</span>; index &lt; list.<span class="hljs-built_in">size</span>(); index++)
{
    QString str = list.<span class="hljs-built_in">at</span>(index);
    str = str.<span class="hljs-built_in">trimmed</span>();
    LOG &lt;&lt; str;
    t = str.<span class="hljs-built_in">toInt</span>(&amp;ok);
    <span class="hljs-keyword">if</span>(ok)
    {
        <span class="hljs-keyword">break</span>;
    }
}
<span class="hljs-comment">// false失败</span>
<span class="hljs-keyword">if</span>(!ok)
{
    <span class="hljs-function">emit <span class="hljs-title">signal_detectTemperature</span><span class="hljs-params">(<span class="hljs-literal">false</span>, <span class="hljs-type">_t</span>)</span></span>;
    <span class="hljs-comment">// 下一次检测</span>
    QTimer::<span class="hljs-built_in">singleShot</span>(_intervalMs, <span class="hljs-keyword">this</span>, <span class="hljs-built_in">SLOT</span>(<span class="hljs-built_in">slot_loop</span>()));
    <span class="hljs-keyword">return</span>;
}

<span class="hljs-comment">// 转换</span>
<span class="hljs-type">_t</span> = (t - <span class="hljs-number">2732</span>) * <span class="hljs-number">1.0f</span> / <span class="hljs-number">10</span>;

<span class="hljs-comment">// 抛出温度</span>
<span class="hljs-function">emit <span class="hljs-title">signal_detectTemperature</span><span class="hljs-params">(<span class="hljs-literal">true</span>, <span class="hljs-type">_t</span>)</span></span>;

#else

<span class="hljs-comment">// sensors,有些电脑可能没安装,安装方法如下:</span>
<span class="hljs-comment">// sudo apt-get install lm-sensors hddtemp</span>
<span class="hljs-comment">// sudo sensors-detect</span>
<span class="hljs-comment">// sensors</span>

QProcess process;
process.<span class="hljs-built_in">start</span>(<span class="hljs-string">"sensors"</span>);
process.<span class="hljs-built_in">waitForFinished</span>();

QString result = process.<span class="hljs-built_in">readAllStandardOutput</span>();
LOG &lt;&lt; result;

result = result.<span class="hljs-built_in">replace</span>(<span class="hljs-string">"\r"</span>,<span class="hljs-string">""</span>);
LOG &lt;&lt; result;

<span class="hljs-type">bool</span> ok = <span class="hljs-literal">false</span>;
QStringList list = result.<span class="hljs-built_in">split</span>(<span class="hljs-string">"\n"</span>, QString::SkipEmptyParts);
LOG &lt;&lt; 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;
}

<span class="hljs-comment">// 抛出温度</span>
<span class="hljs-function">emit <span class="hljs-title">signal_detectTemperature</span><span class="hljs-params">(<span class="hljs-literal">true</span>, <span class="hljs-type">_t</span>)</span></span>;

#endif
#endif

 

入坑

入坑一:windows 获取不到输出

问题

  在这里插入图片描述

原因

  win10 获取系统设备相关信息,需要管理员权限。

解决

  发布时:1. 点击 exe 右键,使用管理员运行。
  发布时 / 开发时:1. 可以直接 exe 鼠标右键属性,勾选管理员权限运行,后面开发就可以了。
  开发时:2. 开发的时候,可以直接使用管理员权限打开 QtCreator 即可。

入坑二:linux 获取不到温度

问题

  没有传感器输出:
  在这里插入图片描述

原因

  因为是使用虚拟机上开发,实际是没有传感器等一些数据的,都是 No。( 注意:直接开发 ubuntu 驱动时,查看操作系统上设备树,所有寄存器地址都是 0x0000000,也是一样的道理,与硬件相关的,虚拟机是模拟的,没有实际)

解决

  重新装了一台物理麒麟机,测试可以。
  在这里插入图片描述