zoukankan      html  css  js  c++  java
  • Qt 获取系统内存使用率,CPU使用率,硬盘容量(windows、linux都可用)

    我写了个获取系统资源的类,通过宏定义的方式区分了linux下和windows下各运行不同的代码。
    头文件:

     1 #ifndef RESOURCE_MINITOR_H
     2 #define RESOURCE_MINITOR_H
     3 #include <QObject>
     4 #include <QTimer>
     5 #include <QProcess>
     6 #include <QDebug>
     7 #include <QString>
     8 #if defined(Q_OS_LINUX)
     9 #include "sys/statfs.h"
    10 #else
    11 #pragma comment(lib,"Kernel32.lib")
    12 #pragma comment(lib,"Psapi.lib")
    13 #include <windows.h>
    14 #include <tlhelp32.h>
    15 #include<direct.h>
    16 #include<winternl.h>
    17 #include <psapi.h>
    18 //#include <atlconv.h>
    19 #include <cmath>
    20 #include <string.h>
    21 #endif
    22 
    23 class MySysInfo : public QObject
    24 {
    25     Q_OBJECT
    26 public:
    27     explicit MySysInfo(QObject *parent = nullptr);
    28 private slots:
    29     void GetResource();
    30 public:
    31     bool GetMemUsage(double &nMemTotal,double &nMemUsed);
    32     bool GetNetUsage();
    33     bool GetDiskSpeed();
    34     bool GetCpuUsage(double &nCpuRate);
    35     bool GetdiskSpace(unsigned long &lFreeAll,unsigned long &lTotalAll);
    36     bool GetPathSpace(const QString & path);
    37 private:
    38     const int m_timer_interval__ = 1000;
    39     QTimer monitor_timer__;
    40     double m_send_bytes__ = 0;
    41     double m_recv_bytes__ = 0;
    42     double m_disk_read__ = 0;
    43     double m_disk_write__ = 0;
    44     double m_cpu_total__ = 0;
    45     double m_cpu_use__ = 0;
    46 };
    47 #endif // RESOURCE_MINITOR_H

    源文件:

      1 #include "mysysinfo.h"
      2 MySysInfo::MySysInfo(QObject *parent) : QObject(parent)
      3 {
      4     connect(&monitor_timer__, &QTimer::timeout, this, &MySysInfo::GetResource);
      5     monitor_timer__.start(m_timer_interval__);
      6 }
      7 void MySysInfo::GetResource()
      8 {
      9     double nCpuRate = 0;
     10     GetCpuUsage(nCpuRate);
     11     GetDiskSpeed();
     12     double nMemTotal;
     13     double nMemUsed;
     14     GetMemUsage(nMemTotal,nMemUsed);
     15     GetNetUsage();
     16     unsigned long lFreeAll;
     17     unsigned long lTotalAll;
     18     GetdiskSpace(lFreeAll,lTotalAll);
     19     GetPathSpace("/");
     20     qDebug()<<"
    ";
     21 }
     22 bool MySysInfo::GetMemUsage(double &nMemTotal,double &nMemUsed)
     23 {
     24 #if defined(Q_OS_LINUX)
     25     QProcess process;
     26     process.start("free -m"); //使用free完成获取
     27     process.waitForFinished();
     28     process.readLine();
     29     QString str = process.readLine();
     30     str.replace("
    ","");
     31     str.replace(QRegExp("( ){1,}")," ");//将连续空格替换为单个空格 用于分割
     32     auto lst = str.split(" ");
     33     if(lst.size() > 6)
     34     {
     35         qDebug("mem total:%.0lfMB free:%.0lfMB",lst[1].toDouble(),lst[6].toDouble());
     36         nMemTotal = lst[1].toDouble();
     37         nMemUsed = nMemTotal-lst[6].toDouble();
     38         return true;
     39     }
     40     else
     41     {
     42         return false;
     43     }
     44 #else
     45     MEMORYSTATUSEX memsStat;
     46         memsStat.dwLength = sizeof(memsStat);
     47         if(!GlobalMemoryStatusEx(&memsStat))//如果获取系统内存信息不成功,就直接返回
     48         {
     49             return false;
     50         }
     51         double nMemFree = memsStat.ullAvailPhys/( 1024.0*1024.0 );
     52         nMemTotal = memsStat.ullTotalPhys/( 1024.0*1024.0 );
     53         nMemUsed= nMemTotal- nMemFree;
     54         qDebug("windows:mem total:%.0lfMB,use:%.0lfMB",nMemTotal,nMemUsed);
     55         return true;
     56 #endif
     57 }
     58 bool MySysInfo::GetNetUsage()
     59 {
     60 #if defined(Q_OS_LINUX)
     61     QProcess process;
     62     process.start("cat /proc/net/dev"); //读取文件/proc/net/dev获取网络收发包数量,再除取样时间得到网络速度
     63     process.waitForFinished();
     64     process.readLine();
     65     process.readLine();
     66     while(!process.atEnd())
     67     {
     68         QString str = process.readLine();
     69         str.replace("
    ","");
     70         str.replace(QRegExp("( ){1,}")," ");
     71         auto lst = str.split(" ");
     72         if(lst.size() > 9 && lst[0] == "enp2s0:")
     73         {
     74             double recv = 0;
     75             double send = 0;
     76             if(lst.size() > 1)
     77                 recv = lst[1].toDouble();
     78             if(lst.size() > 9)
     79                 send = lst[9].toDouble();
     80             qDebug("%s 接收速度:%.0lfbyte/s 发送速度:%.0lfbyte/s",lst[0].toStdString().c_str(),(recv - m_recv_bytes__) / (m_timer_interval__ / 1000.0),(send - m_send_bytes__) / (m_timer_interval__ / 1000.0));
     81             m_recv_bytes__ = recv;
     82             m_send_bytes__ = send;
     83         }
     84     }
     85 #endif
     86     return true;
     87 }
     88 #if defined(Q_OS_WIN32)
     89 __int64 Filetime2Int64(const FILETIME* ftime)
     90 {
     91     LARGE_INTEGER li;
     92     li.LowPart = ftime->dwLowDateTime;
     93     li.HighPart = ftime->dwHighDateTime;
     94     return li.QuadPart;
     95 }
     96 
     97 __int64 CompareFileTime(FILETIME preTime,FILETIME nowTime)
     98 {
     99     return Filetime2Int64(&nowTime) - Filetime2Int64(&preTime);
    100 }
    101 #endif
    102 bool MySysInfo::GetCpuUsage(double &nCpuRate)
    103 {
    104     nCpuRate = -1;
    105 #if defined(Q_OS_LINUX)
    106     QProcess process;
    107     process.start("cat /proc/stat");
    108     process.waitForFinished();
    109     QString str = process.readLine();
    110     str.replace("
    ","");
    111     str.replace(QRegExp("( ){1,}")," ");
    112     auto lst = str.split(" ");
    113     if(lst.size() > 3)
    114     {
    115         double use = lst[1].toDouble() + lst[2].toDouble() + lst[3].toDouble();
    116         double total = 0;
    117         for(int i = 1;i < lst.size();++i)
    118             total += lst[i].toDouble();
    119         if(total - m_cpu_total__ > 0)
    120         {
    121             qDebug("cpu rate:%.2lf%%",(use - m_cpu_use__) / (total - m_cpu_total__) * 100.0);
    122             m_cpu_total__ = total;
    123             m_cpu_use__ = use;
    124             nCpuRate = (use - m_cpu_use__) / (total - m_cpu_total__) * 100.0;
    125             return true;
    126         }
    127     }
    128 #else
    129     HANDLE hEvent;
    130         bool res;
    131         static FILETIME preIdleTime;
    132         static FILETIME preKernelTime;
    133         static FILETIME preUserTime;
    134         FILETIME idleTime;
    135         FILETIME kernelTime;
    136         FILETIME userTime;
    137         res = GetSystemTimes(&idleTime,&kernelTime,&userTime);
    138         preIdleTime = idleTime;
    139         preKernelTime = kernelTime;
    140         preUserTime = userTime;
    141         hEvent = CreateEvent(nullptr,FALSE,FALSE,nullptr);//初始值为nonsignaled
    142         WaitForSingleObject(hEvent,500);//等待500毫秒
    143         res = GetSystemTimes(&idleTime,&kernelTime,&userTime);
    144         long long idle = CompareFileTime(preIdleTime,idleTime);
    145         long long kernel = CompareFileTime(preKernelTime,kernelTime);
    146         long long user = CompareFileTime(preUserTime,userTime);
    147         nCpuRate =ceil( 100.0*( kernel + user - idle ) / ( kernel + user ) );
    148         qDebug()<<"windows:CPU use rate:"<<nCpuRate<<"%";
    149 #endif
    150     return true;
    151 }
    152 bool MySysInfo::GetDiskSpeed()
    153 {
    154 #if defined(Q_OS_LINUX)
    155     QProcess process;
    156     process.start("iostat -k -d");
    157     process.waitForFinished();
    158     process.readLine();
    159     process.readLine();
    160     process.readLine();
    161     QString str = process.readLine();
    162     str.replace("
    ","");
    163     str.replace(QRegExp("( ){1,}")," ");
    164     auto lst = str.split(" ");
    165     if(lst.size() > 5)
    166     {
    167         qDebug("disk read:%.0lfkb/s disk write:%.0lfkb/s",(lst[4].toDouble() - m_disk_read__ ) / (m_timer_interval__ / 1000.0),(lst[5].toDouble() - m_disk_write__) / (m_timer_interval__ / 1000.0));
    168         m_disk_read__ = lst[4].toDouble();
    169         m_disk_write__ = lst[5].toDouble();
    170         return true;
    171     }
    172 #endif
    173     return false;
    174 }
    175 bool MySysInfo::GetdiskSpace(unsigned long &lFreeAll,unsigned long &lTotalAll)
    176 {
    177 #if defined(Q_OS_LINUX)
    178     QProcess process;
    179     process.start("df -k");
    180     process.waitForFinished();
    181     process.readLine();
    182     while(!process.atEnd())
    183     {
    184         QString str = process.readLine();
    185         if(str.startsWith("/dev/sda"))
    186         {
    187             str.replace("
    ","");
    188             str.replace(QRegExp("( ){1,}")," ");
    189             auto lst = str.split(" ");
    190             if(lst.size() > 5)
    191                 qDebug("挂载点:%s 已用:%.0lfMB 可用:%.0lfMB",lst[5].toStdString().c_str(),lst[2].toDouble()/1024.0,lst[3].toDouble()/1024.0);
    192             lFreeAll += lst[2].toDouble()/1024.0;
    193             lTotalAll += lst[3].toDouble()/1024.0+lFreeAll;
    194         }
    195     }
    196 #else
    197 
    198     static char path[_MAX_PATH];//存储当前系统存在的盘符
    199     int curdrive = _getdrive();
    200     lFreeAll = 0UL;
    201     lTotalAll = 0UL;
    202     for(int drive = 1; drive <= curdrive; drive++ )//遍历所有盘符
    203     {
    204         if( !_chdrive( drive ) )
    205         {
    206             sprintf(path, "%c:\", drive + 'A' - 1 );
    207             ULARGE_INTEGER caller, total, free;
    208             WCHAR wszClassName[_MAX_PATH];
    209             memset(wszClassName,0,sizeof(wszClassName));
    210             MultiByteToWideChar(CP_ACP,0,path,strlen(path)+1,wszClassName,
    211                 sizeof(wszClassName)/sizeof(wszClassName[0]));
    212             if (GetDiskFreeSpaceEx(wszClassName, &caller, &total, &free) == 0)
    213             {
    214                 qDebug()<<"GetDiskFreeSpaceEx Filed!";
    215                 return false;
    216             }
    217 
    218             double dTepFree = free.QuadPart/( 1024.0*1024.0 );
    219             double dTepTotal = total.QuadPart/( 1024.0*1024.0 );
    220             qDebug()<<"Get Windows Disk Information:"<<path<<"--free:"<<dTepFree<<"MB,--total:"<<dTepTotal<<"MB";
    221             lFreeAll += ceil(dTepFree);
    222             lTotalAll += ceil(dTepTotal);
    223         }
    224     }
    225     qDebug("Total disk capacity:%lu MB,Free disk capacity:%lu MB",lTotalAll,lFreeAll);
    226 #endif
    227     return true;
    228 }
    229 bool MySysInfo::GetPathSpace(const QString & path)
    230 {
    231 #if defined(Q_OS_LINUX)
    232     struct statfs diskInfo;//需要#include "sys/statfs.h"
    233     statfs(path.toUtf8().data(), &diskInfo);
    234     qDebug("%s 总大小:%.0lfMB 可用大小:%.0lfMB",path.toStdString().c_str(),(diskInfo.f_blocks * diskInfo.f_bsize)/1024.0/1024.0,(diskInfo.f_bavail * diskInfo.f_bsize)/1024.0/1024.0);
    235 #endif
    236     return true;
    237 }
  • 相关阅读:
    虚拟机VMware 8安装Linux系统详细过程图解
    NSMutableArray 对象的一些方法
    NSString类中 哦见过的方法
    c语言的 地址运算符 & 和 指针运算符* 的区别
    const 静态的变量
    float scale = [[UIScreen mainScreen] scale]
    core Data 中 TIMESTAMP 类型
    NSPredicate
    xcode中解决 nslog 控制台 显示不出来
    按字符串读取文件内容NSString stringWithContentsOfFile: (NSString类方法)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13862489.html
Copyright © 2011-2022 走看看