粗粗短短 發表於 2024-2-26 10:57:00

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

<div class="cl-preview-section">
<h1>需求</h1>
</div>
<div class="cl-preview-section">
<p>  使用Qt软件开发一个检测cpu温度的功能。<br>  兼容windows、linux,国产麒麟系统(同为linux)</p>


</div>
<div class="cl-preview-section">
<h1>Demo</h1>


</div>
<div class="cl-preview-section">
<p>  windows上运行(需要管理员权限):<br>  <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749794-283762486.png"></p>


</div>
<div class="cl-preview-section">
<p>  国产麒麟操作上运行(需要管理员权限):<br>  <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749838-1290847088.png"></p>


</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>功能描述 v1.1.0</h1>


</div>
<div class="cl-preview-section">
<ul>
<li>windows上定时检测输出cpu温度。</li>
<li>linux上定时检测输出cpu温度。</li>
<li>国产银河麒麟操作系统上输出cpu温度。</li>


</ul>


</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>模块化部署</h1>


</div>
<div class="cl-preview-section">
<p>  <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749703-361448169.png"></p>


</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>关键源码</h1>


</div>
<div class="cl-preview-section">
<pre><code class="prism language-cpp"><span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">ifndef <span class="token expression">LINUX
    QString cmd <span class="token operator">= <span class="token function">QString<span class="token punctuation">(<span class="token string">"wmic /namespace:\\\\root\\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature"<span class="token punctuation">)<span class="token punctuation">;

    QProcess process<span class="token punctuation">;
    process<span class="token punctuation">.<span class="token function">start<span class="token punctuation">(cmd<span class="token punctuation">)<span class="token punctuation">;
    process<span class="token punctuation">.<span class="token function">waitForFinished<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;

    QString result <span class="token operator">= process<span class="token punctuation">.<span class="token function">readAllStandardOutput<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
    LOG <span class="token operator">&lt;&lt; result<span class="token punctuation">;

    result <span class="token operator">= result<span class="token punctuation">.<span class="token function">replace<span class="token punctuation">(<span class="token string">"\r"<span class="token punctuation">, <span class="token string">""<span class="token punctuation">)<span class="token punctuation">;
    LOG <span class="token operator">&lt;&lt; result<span class="token punctuation">;
   
    QStringList list <span class="token operator">= result<span class="token punctuation">.<span class="token function">split<span class="token punctuation">(<span class="token string">"\n"<span class="token punctuation">, QString<span class="token double-colon punctuation">::SkipEmptyParts<span class="token punctuation">)<span class="token punctuation">;
    LOG <span class="token operator">&lt;&lt; list<span class="token punctuation">;

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

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

    <span class="token comment">// 抛出温度
    emit <span class="token function">signal_detectTemperature<span class="token punctuation">(<span class="token boolean">true<span class="token punctuation">, _t<span class="token punctuation">)<span class="token punctuation">;
   
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">else

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

    QProcess process<span class="token punctuation">;
    process<span class="token punctuation">.<span class="token function">start<span class="token punctuation">(<span class="token string">"sensors"<span class="token punctuation">)<span class="token punctuation">;
    process<span class="token punctuation">.<span class="token function">waitForFinished<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;

    QString result <span class="token operator">= process<span class="token punctuation">.<span class="token function">readAllStandardOutput<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
    LOG <span class="token operator">&lt;&lt; result<span class="token punctuation">;

    result <span class="token operator">= result<span class="token punctuation">.<span class="token function">replace<span class="token punctuation">(<span class="token string">"\r"<span class="token punctuation">,<span class="token string">""<span class="token punctuation">)<span class="token punctuation">;
    LOG <span class="token operator">&lt;&lt; result<span class="token punctuation">;

    <span class="token keyword">bool ok <span class="token operator">= <span class="token boolean">false<span class="token punctuation">;
    QStringList list <span class="token operator">= result<span class="token punctuation">.<span class="token function">split<span class="token punctuation">(<span class="token string">"\n"<span class="token punctuation">, QString<span class="token double-colon punctuation">::SkipEmptyParts<span class="token punctuation">)<span class="token punctuation">;
    LOG <span class="token operator">&lt;&lt; list<span class="token punctuation">;
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">if <span class="token expression"><span class="token number">1
    <span class="token keyword">for<span class="token punctuation">(<span class="token keyword">int index <span class="token operator">= <span class="token number">0<span class="token punctuation">; index <span class="token operator">&lt; list<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">; index<span class="token operator">++<span class="token punctuation">)
    <span class="token punctuation">{
      QString str <span class="token operator">= list<span class="token punctuation">.<span class="token function">at<span class="token punctuation">(index<span class="token punctuation">)<span class="token punctuation">;
      <span class="token comment">// 注意:
      <span class="token comment">//      1.虚拟机是无法获取温度的
      <span class="token comment">// Physical id 0: +39.0°C(high = +80.0°C, crit = +100.0°C)
      <span class="token comment">// Core 0:      +33.0°C(high = +80.0°C, crit = +100.0°C)
      <span class="token comment">// Core 1:      +35.0°C(high = +80.0°C, crit = +100.0°C)
      <span class="token comment">// Core 2:      +36.0°C(high = +80.0°C, crit = +100.0°C)
      <span class="token comment">// Core 3:      +39.0°C(high = +80.0°C, crit = +100.0°C)
      <span class="token keyword">if<span class="token punctuation">(str<span class="token punctuation">.<span class="token function">contains<span class="token punctuation">(<span class="token string">"Core 0"<span class="token punctuation">)<span class="token punctuation">)
      <span class="token punctuation">{
            LOG <span class="token operator">&lt;&lt; str<span class="token punctuation">;
            QStringList subList <span class="token operator">= str<span class="token punctuation">.<span class="token function">split<span class="token punctuation">(<span class="token string">" "<span class="token punctuation">, QString<span class="token double-colon punctuation">::SkipEmptyParts<span class="token punctuation">)<span class="token punctuation">;
            LOG <span class="token operator">&lt;&lt; subList<span class="token punctuation">;
            <span class="token keyword">if<span class="token punctuation">(subList<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">) <span class="token operator">&gt; <span class="token number">3<span class="token punctuation">)
            <span class="token punctuation">{
                QString s <span class="token operator">= subList<span class="token punctuation">.<span class="token function">at<span class="token punctuation">(<span class="token number">2<span class="token punctuation">)<span class="token punctuation">;
                <span class="token comment">// ("Core", "0:", "+33.0°C", "(high", "=", "+80.0°C,", "crit", "=", "+100.0°C)")
                <span class="token keyword">if<span class="token punctuation">(s<span class="token punctuation">.<span class="token function">startsWith<span class="token punctuation">(<span class="token string">"+"<span class="token punctuation">) <span class="token operator">&amp;&amp; s<span class="token punctuation">.<span class="token function">endsWith<span class="token punctuation">(<span class="token string">"°C"<span class="token punctuation">)<span class="token punctuation">)
                <span class="token punctuation">{
                  _t <span class="token operator">= s<span class="token punctuation">.<span class="token function">mid<span class="token punctuation">(<span class="token number">1<span class="token punctuation">, s<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">) <span class="token operator">- <span class="token number">1 <span class="token operator">- <span class="token number">2<span class="token punctuation">)<span class="token punctuation">.<span class="token function">toDouble<span class="token punctuation">(<span class="token operator">&amp;ok<span class="token punctuation">)<span class="token punctuation">;
                <span class="token punctuation">}
            <span class="token punctuation">}
            <span class="token keyword">break<span class="token punctuation">;
      <span class="token punctuation">}
    <span class="token punctuation">}
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">else
    QString str <span class="token operator">= <span class="token string">"Core 0:      +33.2°C(high = +80.0°C, crit = +100.0°C)"<span class="token punctuation">;
    <span class="token keyword">if<span class="token punctuation">(str<span class="token punctuation">.<span class="token function">contains<span class="token punctuation">(<span class="token string">"Core 0"<span class="token punctuation">)<span class="token punctuation">)
    <span class="token punctuation">{
      LOG <span class="token operator">&lt;&lt; str<span class="token punctuation">;
      QStringList subList <span class="token operator">= str<span class="token punctuation">.<span class="token function">split<span class="token punctuation">(<span class="token string">" "<span class="token punctuation">, QString<span class="token double-colon punctuation">::SkipEmptyParts<span class="token punctuation">)<span class="token punctuation">;
      LOG <span class="token operator">&lt;&lt; subList<span class="token punctuation">;
      <span class="token keyword">if<span class="token punctuation">(subList<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">) <span class="token operator">&gt; <span class="token number">3<span class="token punctuation">)
      <span class="token punctuation">{
            QString s <span class="token operator">= subList<span class="token punctuation">.<span class="token function">at<span class="token punctuation">(<span class="token number">2<span class="token punctuation">)<span class="token punctuation">;
            <span class="token comment">// ("Core", "0:", "+33.0°C", "(high", "=", "+80.0°C,", "crit", "=", "+100.0°C)")
            <span class="token keyword">if<span class="token punctuation">(s<span class="token punctuation">.<span class="token function">startsWith<span class="token punctuation">(<span class="token string">"+"<span class="token punctuation">) <span class="token operator">&amp;&amp; s<span class="token punctuation">.<span class="token function">endsWith<span class="token punctuation">(<span class="token string">"°C"<span class="token punctuation">)<span class="token punctuation">)
            <span class="token punctuation">{
                _t <span class="token operator">= s<span class="token punctuation">.<span class="token function">mid<span class="token punctuation">(<span class="token number">1<span class="token punctuation">, s<span class="token punctuation">.<span class="token function">size<span class="token punctuation">(<span class="token punctuation">) <span class="token operator">- <span class="token number">1 <span class="token operator">- <span class="token number">2<span class="token punctuation">)<span class="token punctuation">.<span class="token function">toDouble<span class="token punctuation">(<span class="token operator">&amp;ok<span class="token punctuation">)<span class="token punctuation">;
            <span class="token punctuation">}
      <span class="token punctuation">}
    <span class="token punctuation">}
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">endif
    <span class="token comment">// false失败
    <span class="token keyword">if<span class="token punctuation">(<span class="token operator">!ok<span class="token punctuation">)
    <span class="token punctuation">{
      emit <span class="token function">signal_detectTemperature<span class="token punctuation">(<span class="token boolean">false<span class="token punctuation">, _t<span class="token punctuation">)<span class="token punctuation">;
      <span class="token comment">// 下一次检测
      <span class="token class-name">QTimer<span class="token double-colon punctuation">::<span class="token function">singleShot<span class="token punctuation">(_intervalMs<span class="token punctuation">, <span class="token keyword">this<span class="token punctuation">, <span class="token function">SLOT<span class="token punctuation">(<span class="token function">slot_loop<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">;
      <span class="token keyword">return<span class="token punctuation">;
    <span class="token punctuation">}

    <span class="token comment">// 抛出温度
    emit <span class="token function">signal_detectTemperature<span class="token punctuation">(<span class="token boolean">true<span class="token punctuation">, _t<span class="token punctuation">)<span class="token punctuation">;

<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">endif
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">endif
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>入坑</h1>
</div>
<div class="cl-preview-section">
<h2>入坑一:windows获取不到输出</h2>
</div>
<div class="cl-preview-section">
<h3>问题</h3>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749753-230614941.png"></p>
</div>
<div class="cl-preview-section">
<h3>原因</h3>
</div>
<div class="cl-preview-section">
<p>  win10获取系统设备相关信息,需要管理员权限。</p>
</div>
<div class="cl-preview-section">
<h3>解决</h3>
</div>
<div class="cl-preview-section">
<p>  发布时:1.点击exe右键,使用管理员运行。<br>  发布时/开发时:1.可以直接exe鼠标右键属性,勾选管理员权限运行,后面开发就可以了。<br>  开发时:2.开发的时候,可以直接使用管理员权限打开QtCreator即可。</p>


</div>
<div class="cl-preview-section">
<h2>入坑二:linux获取不到温度</h2>


</div>
<div class="cl-preview-section">
<h3>问题</h3>


</div>
<div class="cl-preview-section">
<p>  没有传感器输出:<br>  <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749686-1700747051.png"></p>


</div>
<div class="cl-preview-section">
<h3>原因</h3>


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


</div>
<div class="cl-preview-section">
<h3>解决</h3>


</div>
<div class="cl-preview-section">
<p>  重新装了一台物理麒麟机,测试可以。<br>  <img src="https://img2024.cnblogs.com/blog/1971530/202402/1971530-20240226105749763-434810978.png"></p>


</div><br><br>
来源:https://www.cnblogs.com/qq21497936/p/18033865
頁: [1]
查看完整版本: 项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)