项目实战:Qt(cpu趋近于零消耗)获取windows的cpu使用率和内存占用率

若该文为原创文章,转载请注明出处

本文章博客地址:https://hpzwl.blog.csdn.net/article/details/161026020
长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...

Qt开发专栏:项目实战(点击传送门)

需求

工控系统上新增cpu使用率和内存使用率,并需要每秒检测绘制曲线。

Demo_v1.0.0

windows运行包下载地址

CSDNf粉丝0积分下载:https://download.csdn.net/download/qq21497936/92866962

博主用户名有QQ技术群,进QQ群,点击"文件 "搜索"cpu",群内与博文同步更新)

功能描述 v1.0.0

  • windows上定时检测cpu使用率和内存使用率。
  • 循环1s一次,基本对cpu零消耗(区别于QProcess占用cpu和内存循环跑的方式)。

模块化部署

关键源码

cpp 复制代码
#include "CpuManager.h"

#include <Windows.h>
#include <Pdh.h>
#include <psapi.h>

#include <QTimer>

#include <QDebug>
#include <QDateTime>
//#define LOG qDebug()<<__FILE__<<__LINE__
//#define LOG qDebug()<<__FILE__<<__LINE__<<__FUNCTION__
//#define LOG qDebug()<<__FILE__<<__LINE__<<QThread()::currentThread()
//#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd")
#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz")

static PDH_HQUERY cpuQuery;
static PDH_HCOUNTER cpuTotal;

CpuManager::CpuManager(QObject *parent)
    : QObject(parent),
      _running(false),
      _checking(false),
      _intervalMs(1000)
{

}

void CpuManager::slot_start()
{
    if(_running)
    {
        LOG << "It's already running!";
        return;
    }

    initCpuMonitor();

    _running = true;
}

void CpuManager::slot_stop()
{
    if(!_running)
    {
        LOG << "It's not running!";
        return;
    }
    _running = false;
}

void CpuManager::slot_startCheck()
{
    if(!_running)
    {
        LOG << "It's not running!";
        return;
    }
    if(_checking)
    {
        LOG << "It's already checking!";
        return;
    }

    QTimer::singleShot(1, this, SLOT(slot_loop()));

    _checking = true;
}

void CpuManager::slot_stopCheck()
{
    if(!_running)
    {
        LOG << "It's not running!";
        return;
    }
    if(!_checking)
    {
        LOG << "It's not checking!";
        return;
    }

    _checking = false;
}

void CpuManager::slot_loop()
{
    if(!_running || !_checking)
    {
        LOG << "if(!_running || !_checking)";
        return;
    }

    // 获取cpu使用率
    double cpuUsage = getCpuUsage();
    // 获取内存使用大小
    quint64 totalMem;
    quint64 avaliMem;
    getSystemMemory(totalMem, avaliMem);
    // 获取本进程内存使用大小
    quint64 processMem = getProcessMemory();

    // 抛出信号
    emit signal_cpuCheck(cpuUsage, totalMem, avaliMem, processMem);

    // 定时继续执行下一次
    QTimer::singleShot(_intervalMs, this, SLOT(slot_loop()));
}

void CpuManager::initCpuMonitor()
{
    PdhOpenQuery(NULL, 0, &cpuQuery);
    PdhAddCounter(cpuQuery, L"\\Processor Information(_Total)\\% Processor Time", 0, &cpuTotal);
    PdhCollectQueryData(cpuQuery);
}

double CpuManager::getCpuUsage()
{
    PDH_FMT_COUNTERVALUE value;
    PdhCollectQueryData(cpuQuery);
    PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &value);
    return value.doubleValue;
}

void CpuManager::getSystemMemory(quint64 &totalMem, quint64 &availMem)
{
    MEMORYSTATUSEX memoryStatusex;
    memoryStatusex.dwLength = sizeof(memoryStatusex);
    GlobalMemoryStatusEx(&memoryStatusex);

    totalMem = memoryStatusex.ullTotalPhys / (1024 * 1024);
    availMem = memoryStatusex.ullAvailPhys / (1024 * 1024);
}

quint64 CpuManager::getProcessMemory()
{
    PROCESS_MEMORY_COUNTERS processMemoryCounters;
    if(GetProcessMemoryInfo(GetCurrentProcess(), &processMemoryCounters, sizeof(processMemoryCounters)))
    {
        return processMemoryCounters.WorkingSetSize / (1024 * 1024);
    }
    return 0;
}

int CpuManager::getIntervalMs()
{
    return _intervalMs;
}

void CpuManager::setIntervalMs(int intervalMs)
{
    _intervalMs = intervalMs;
}

工程模板

本文章博客地址:https://hpzwl.blog.csdn.net/article/details/161026020

相关推荐
buhuizhiyuci1 小时前
【QT-百日筑基篇】功法有些小成,开始进行打怪升级-QT的实践第一课,创建Hello World的几种方法
开发语言·qt
小短腿的代码世界2 小时前
颠覆QWidget与QML?QSkinny轻量级UI框架的架构革命与嵌入式场景实战
qt·ui·架构
十年之少2 小时前
使用VSCode 对PyQt5 say Hello—— Python + Qt 开发
vscode·python·qt
czxyvX3 小时前
5-Qt系统相关
开发语言·qt
小短腿的代码世界4 小时前
Qt libQGLViewer 深度解析:高性能OpenGL 3D交互查看器的架构设计与性能优化
qt·3d·交互
小短腿的代码世界4 小时前
Qt SSH2 深度解析:安全远程通信架构与源码级实现
qt·安全·架构
代钦塔拉13 小时前
Qt4 vs Qt5 带参数信号槽的连接方式详解
开发语言·数据库·qt
不午休の野猫16 小时前
vs + qt环境编译.sln项目时报无法解析的外部符号metaObject && qt_metacast
开发语言·qt
牵牛老人1 天前
CAN通讯实战:Qt基于周立功 USBCAN 的 CAN 总线通信开发全攻略
网络·qt·系统架构