项目实战: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

相关推荐
郝学胜_神的一滴6 小时前
Qt 高级开发 021:零基础吃透 QVBoxLayout 垂直布局
c++·qt
誰能久伴不乏11 小时前
libmodbus 在 Windows 环境下报 “Invalid argument“ 的排错记录
c++·qt·modbus
小许同学记录成长12 小时前
网格简化算法 — Edge Collapse(边塌缩)
qt·算法
tangchao340勤奋的老年?13 小时前
遮挡式引导界面设计
qt
酬勤-人间道13 小时前
VTK 与 Cesium-native 结合实践:小场景三维编辑 + 数字地球精准贴合
c++·qt·vtk·遥感·岩土·cesium-native
誰能久伴不乏13 小时前
Qt C++ 解析 JSON 完全指南:从核心概念到工业级实战
c++·qt·json
雪的季节15 小时前
Qt 高性能绘图的核心原理
qt
Irissgwe15 小时前
一、Qt 概述
c++·qt·gui·qt creator
m0_6174939415 小时前
PySide6/PyQt6实现中英文切换完整教程(Qt Designer + Qt Linguist + 动态切换)
开发语言·qt
咸鱼翻身小阿橙15 小时前
文件读写 + Qt Model/View + 自定义分页+搜索过滤
java·数据库·qt