调用了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。
欢迎交流与讨论。