Qt下使用JQCPUMonitor监控CPU使用率

62 篇文章 8 订阅

调用了JQCPUMonitor库,实现间隔一定时间,自动发出信号,使用了线程的方式,避免阻塞主线程,同时也提供了直接获取当前设置下的CPU使用率。

下面是源代码:

//author:autumoon
//联系QQ:4589968
//日期:2021-12-27

#ifndef CPUUSAGESIGNAL_H
#define CPUUSAGESIGNAL_H

#include <QObject>
#include <QThread>

class CPUUsageSignal : public QObject
{
    Q_OBJECT
public:
    CPUUsageSignal(QObject *parent = nullptr);

    void Run();
    void Stop();

    //设置计算间隔和信号发送间隔
    void SetParameters(const qint64 &nMSecsCalc, const qint64& nMSecsSignal)
    {
        m_nMSecsCalc = nMSecsCalc;
        m_nMSecsSignal = nMSecsSignal;
    }

    //获取当前设置下的当前的cpu使用率
    qreal GetCurCpuUsage();

signals:
    void cpu_usage_custom(qreal);

private:
    bool m_bRunFlag;
    qint64 m_nMSecsCalc;
    qint64 m_nMSecsSignal;
};

class CpuUsageWorker : public QObject
{
    Q_OBJECT

public slots:
    void doWork(const qint64 &nMSecsCalc, const qint64& nMSecsSignal)
    {
        m_pCUS = new CPUUsageSignal(this);
        m_pCUS->SetParameters(nMSecsCalc, nMSecsSignal);
        connect(m_pCUS, SIGNAL(cpu_usage_custom(qreal)), this, SIGNAL(cpu_usage_custom(qreal)));
        m_pCUS->Run();
    }

public:
    qreal GetCurCpuUsage()
    {
        qreal rCpuUsage;

        if (m_pCUS)
        {
            rCpuUsage = m_pCUS->GetCurCpuUsage();
        }

        return rCpuUsage;
    }

signals:
    void cpu_usage_custom(qreal);
    void cpu_cur_usage(qreal);

private:
    CPUUsageSignal *m_pCUS;
};

class ThreadCPUUsageSignal : public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    ThreadCPUUsageSignal()
    {
        m_worker = new CpuUsageWorker;
        m_worker->moveToThread(&workerThread);
        connect(&workerThread, &QThread::finished, m_worker, &QObject::deleteLater);
        connect(this, &ThreadCPUUsageSignal::start_monitor, m_worker, &CpuUsageWorker::doWork);
        connect(m_worker, &CpuUsageWorker::cpu_usage_custom, this, &ThreadCPUUsageSignal::cpu_usage_custom);
        workerThread.start();
    }

    ~ThreadCPUUsageSignal()
    {
        workerThread.quit();
        workerThread.wait();

        m_worker = nullptr;
    }

public:
    //设置计算间隔和信号发送间隔
    void StartMonitor(const qint64 &nMSecsCalc, const qint64& nMSecsSignal)
    {
        emit start_monitor(nMSecsCalc, nMSecsSignal);
    }

    //获取当前设置下的当前的cpu使用率
    qreal GetCurCpuUsage()
    {
        qreal rCpuUsage;

        if (m_worker)
        {
            rCpuUsage = m_worker->GetCurCpuUsage();
        }

        return rCpuUsage;
    }

signals:
    void cpu_usage_custom(qreal);
    void start_monitor(const qint64 &nMSecsCalc, const qint64& nMSecsSignal);

private:
    CpuUsageWorker *m_worker;
};

#endif // CPUUSAGESIGNAL_H

实现:

#include "CPUUsageSignal.h"
#include "jqcpumonitor.h"

CPUUsageSignal::CPUUsageSignal(QObject *parent) : QObject(parent)
{
    m_bRunFlag = false;
    m_nMSecsCalc = 10 * 1000;
    m_nMSecsSignal = 60 * 1000;
    JQCPUMonitor::initialize();
}

void CPUUsageSignal::Run()
{
    if (m_bRunFlag)
    {
        return;
    }

    m_bRunFlag = true;

    while (m_bRunFlag)
    {
        QThread::sleep(m_nMSecsSignal / 1000);
        qreal rUsage = JQCPUMonitor::cpuUsagePercentageInTime(m_nMSecsCalc);
        emit cpu_usage_custom(rUsage);
    }
}

void CPUUsageSignal::Stop()
{
    m_bRunFlag = false;
}

qreal CPUUsageSignal::GetCurCpuUsage()
{
    return JQCPUMonitor::cpuUsagePercentageInTime(m_nMSecsCalc);
}

Windows下实测通过,理论上也支持Linux或者Mac OS。

欢迎交流与讨论。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值