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

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

时间:2024-02-26 11:00:26浏览次数:27  
标签:windows 麒麟 v1.1 管理员 QString linux cpu

需求

  使用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.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
 

入坑

入坑一:windows获取不到输出

问题

  在这里插入图片描述

原因

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

解决

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

入坑二:linux获取不到温度

问题

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

原因

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

解决

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

标签:windows,麒麟,v1.1,管理员,QString,linux,cpu
From: https://www.cnblogs.com/qq21497936/p/18033865

相关文章

  • 身在Windows,心在Ubuntu
    在数字化时代,操作系统作为计算机的核心,为用户提供了与计算机硬件交互的界面。其中,Windows和Ubuntu无疑是两个备受瞩目的名字。Windows,凭借其友好的用户界面和丰富的软件资源,成为了广大普通用户的首选;而Ubuntu,作为开源世界的佼佼者,以其稳定性、安全性和灵活性赢得了开发者和服务器......
  • Linux内核工作原理
    目录简介简介Linux内核是操作系统的核心组件,负责底层硬件管理和资源分配,为上层应用程序提供一个稳定、统一的运行环境。以下是Linux内核的一些主要工作原理和组成部分:系统调用接口(SCI):SCI层提供了从用户空间到内核的函数调用的机制。它允许应用程序与内核进行交互,执行一些需要......
  • 取消浏览器中记住密码自动填充时弹出Windows安全中心的验证
    1、......
  • linux动态库和静态库 --20240225
    设计库的目的1)程序更加简洁,不需要维护太多的源文件2)保护三方厂商的知识产权gcc常用指令复习一波gcc的常用指令:-E:仅执行预处理(不要编译、汇编或链接)。-S:只编译(不汇编或链接)。-c:编译和汇编,但不链接。-o<file>:指定输出文件。-pie:创建一个动态链接、位置无关的可执行文件......
  • linux内核链表 --20240225
    提起linux内核链表,首先一定得弄清楚的两个linux内核常用宏offsetof&&container_ofoffsetof宏#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)宏解析:1、size_t在系统中一般指unsignedint,无符号整型2、(TYPE*)0,把0地址强制转换成type结构体类型的指针......
  • windows基础命令--新手常用
     systeminfo查看计算机信息(版本,位数,补丁情况)whoami查看当前用户及权限ipconfig查看网卡信息cd切换目录typexxx.txt查看文件内容del删除文件dir显示目录-a浏览所有文件copy要复制的路径下的文件复制到那个路径reagentc/info用于查看Windows恢复环境配置信......
  • 关于Windows上设置MySQL为外部可访问
    改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改"mysql"数据库里的"user"表里的"host"项,从"localhost"改称"%"1.mysql-uroot-pdtsdtsmysql>usemysql;mysql>updateusersethost='%&#......
  • Linux--基础学习
    Linux概念      Linux是一个开发源码的高性能的操作系统。Linux安装      选择在windows系统上安装Linux系统       条件:Ⅰ、CentOS-7-x86_64-DVD-1708.iso            Ⅱ、VMwareWorkstation   ......
  • Linux离线部署SpringBoot前后端分离项目
    本文介绍了在内网下的纯离线环境中部署SpringBoot前后端分离项目,由于是个前端仔,并未接触过linux,在经历诸多错误和踩坑之后,终于部署成功(大哭),在此记录一下。工具选择选择合适的工具进行远程连接,如Xshell、Xftp、putty、Terminus等Xshell:连接远程服务器的命令终端Xftp:连接远......
  • 史上速度最快的Windows来了!Windows 11 24H2将首发支持Wi-Fi 7、USB4 2.0
    据WC报道,Windows1124H2将首次引入对WI-Fi7硬件的支持,该版本预计将在今年晚些时候作为微软的下一个重大操作系统更新推出。此前,支持Wi-Fi7的硬件已经开始发货,但目前版本的Windows上不支持。Wi-Fi7(IEEE802.11be标准),拥有极高的吞吐速率,速度比Wi-Fi6E快近4倍(Wi-Fi7理论峰值4......