quarkai/plugins/systemmonitor/cpuratewidget.cpp

352 lines
12 KiB
C++
Raw Normal View History

2018-01-17 11:45:16 +08:00
/*
* Copyright (C) 2013 ~ 2018 National University of Defense Technology(NUDT) & Tianjin Kylin Ltd.
*
* Authors:
* Kobe Lee xiangli@ubuntukylin.com/kobe24_lixiang@126.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
2018-01-25 18:58:26 +08:00
#include "cpuratewidget.h"
2018-01-17 11:45:16 +08:00
#include "cpuballwidget.h"
#include <QApplication>
#include <QDebug>
#include <QVBoxLayout>
2018-01-26 18:20:43 +08:00
#include <QFile>
2018-01-17 11:45:16 +08:00
2018-01-26 18:20:43 +08:00
inline QString convertTimeToString(long seconds)
2018-01-17 11:45:16 +08:00
{
2018-01-26 18:20:43 +08:00
//test script: cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("已运行:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'
int run_day = seconds / 86400;
int run_hour = (seconds % 86400)/3600;
int run_minute = (seconds % 3600)/60;
int run_second = seconds % 60;
2018-01-17 11:45:16 +08:00
2018-01-26 18:20:43 +08:00
QString hourStr;
QString minuteStr;
QString secondStr;
2018-01-17 11:45:16 +08:00
2018-01-26 18:20:43 +08:00
if (run_hour >1)
hourStr = QString(QObject::tr("%1hours")).arg(run_hour);
else
hourStr = QString(QObject::tr("%1hour")).arg(run_hour);
if (run_minute > 1)
minuteStr = QString(QObject::tr("%1minutes")).arg(run_minute);
else
minuteStr = QString(QObject::tr("%1minute")).arg(run_minute);
if (run_second > 1)
secondStr = QString(QObject::tr("%1seconds")).arg(run_second);
else
secondStr = QString(QObject::tr("%1second")).arg(run_second);
2018-01-26 18:20:43 +08:00
QString run_time;
if (run_day > 0) {
if (run_day == 1)
return QString("%1 %2 %3 %4").arg(QString(QObject::tr("%1day"))).arg(run_day).arg(hourStr).arg(minuteStr).arg(secondStr);
else
return QString("%1 %2 %3 %4").arg(QString(QObject::tr("%1days"))).arg(run_day).arg(hourStr).arg(minuteStr).arg(secondStr);
}
else {
return QString("%1 %2 %3").arg(hourStr).arg(minuteStr).arg(secondStr);
}
2018-01-17 11:45:16 +08:00
2018-01-26 18:20:43 +08:00
return run_time;
}
2018-01-17 11:45:16 +08:00
2018-01-26 18:20:43 +08:00
inline int getCoreCounts()
{
int cpuCounts = 0;
2018-01-17 11:45:16 +08:00
2018-01-26 18:20:43 +08:00
QFile file("/proc/cpuinfo");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString content = file.readLine().trimmed();
while (!content.isEmpty() && content.contains(QChar(':'))) {
const QStringList tokens = content.split(QChar(':'));
if (tokens.size() == 2) {
if (tokens[0] == "processor")
cpuCounts ++;
}
content = file.readLine().trimmed();
}
file.close();
}
2018-01-26 18:20:43 +08:00
if (cpuCounts == 0)
cpuCounts = 4;
2018-01-26 18:20:43 +08:00
return cpuCounts;
}
inline QString getIdelRate(unsigned long &runSeconds, unsigned long &idleSeconds)
{
int cpuNumber = getCoreCounts();
QString rate;
QFile file("/proc/uptime");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString content = file.readLine();
while (!content.isEmpty() && content.contains(" ")) {
QStringList tokens = content.split(" ");//content.split(QChar(' '))
QString runStr = tokens.at(0);//从系统启动到现在的时间(以秒为单位)
if (runStr.contains(QChar('.'))) {
QString senconds = runStr.split(QChar('.')).at(0);
runSeconds = senconds.toLong();
}
else
runSeconds = runStr.toLong();
QString idleStr = tokens.at(1);//系统空闲的时间(以秒为单位)
if (idleStr.contains(QChar('.'))) {
QString senconds = idleStr.split(QChar('.')).at(0);
idleSeconds = senconds.toLong();
}
else
idleSeconds = idleStr.toLong();
rate = QString::number((idleSeconds * 1.0) /(runSeconds *1.0 * cpuNumber) * 100, 'f', 0) + "%";
break;
}
file.close();
}
return rate;
}
inline long readUpdatetimeFile(bool isRunTime)
{
QFile file("/proc/uptime");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString result;
QString content = file.readLine();
while (!content.isEmpty() && content.contains(" ")) {
QStringList tokens = content.split(" ");//content.split(QChar(' '))
if (isRunTime) {
result = tokens.at(0);//从系统启动到现在的时间(以秒为单位)
}
else {
result = tokens.at(1);//系统空闲的时间(以秒为单位)
}
break;
//content = file.readLine();//continue read
}
file.close();
if (result.contains(QChar('.'))) {
QString senconds = result.split(QChar('.')).at(0);
return senconds.toLong();
}
else
return result.toLong();
}
return 0;
}
//系统平均负载
inline QString readLoadAvg()
{
/*cat /proc/loadavg
0.10 0.06 0.01 1/72 29632
31ID*/
return QString();
}
inline void readFile(const QString &fileName)
{
QFile file(fileName);
if (!file.open(QFile::ReadOnly)) {
qCritical() << QString("open %1 failed").arg(fileName);
return;
}
QByteArray content = file.readAll();
file.close();
QTextStream stream(&content, QIODevice::ReadOnly);
while (!stream.atEnd()) {
const QString aline = stream.readLine();
qDebug() << "aline="<<aline;
// const QStringList items = line.split(QChar(':'));
// if (items.size() == 2) {
// qDebug() << "items[0]="<<items[0]<<",items[1]="<<items[0];
// }
}
// while (!file.atEnd()) {
// QString line = file.readLine();
// QString trimmedLine = line.trimmed();
// qDebug() << "line="<<line;
// qDebug() << "trimmedLine="<<trimmedLine;
// if (line.isEmpty() || trimmedLine.isEmpty())
// continue;
// }
// file.close();
}
CpuRateWidget::CpuRateWidget(QWidget *parent) : QWidget(parent)
{
m_layout = new QVBoxLayout(this);
m_layout->setContentsMargins(0, 0, 0, 0);
QWidget *w = new QWidget;
m_contentLayout = new QHBoxLayout(w);
m_contentLayout->setContentsMargins(0, 0, 0, 0);
m_contentLayout->setSpacing(50);
m_layout->addWidget(w, 0, Qt::AlignCenter);
initWidgets();
m_cpuBall->startTimer();
/*unsigned long runtime;
unsigned long idletime;
QString rate = getIdelRate(runtime, idletime);
qDebug() << "rate="<<rate;
qDebug() << convertTimeToString(runtime);
qDebug() << convertTimeToString(idletime);*/
2018-01-17 11:45:16 +08:00
2018-01-25 18:58:26 +08:00
/*sudo dmidecode -t processor
u32 len;
u8 *buf;
size_t size = len;
buf = read_file(&size, devmem);
len = size;
// dmi_table_decode(buf, len, num, ver, flags);
// dmi_decode(&h, ver);*/
2018-01-17 11:45:16 +08:00
}
2018-01-25 18:58:26 +08:00
CpuRateWidget::~CpuRateWidget()
2018-01-17 11:45:16 +08:00
{
2018-01-26 18:20:43 +08:00
delete m_cpuRateTitle;
delete m_cpuRateText;
delete m_cpuIdleRateTitle;
delete m_cpuIdleRateText;
delete m_cpuRunTimeTitle;
delete m_cpuRunTimeText;
delete m_cpuIdleTimeTitle;
delete m_cpuIdleTimeText;
2018-01-17 11:45:16 +08:00
delete m_cpuBall;
QLayoutItem *child;
2018-01-26 18:20:43 +08:00
while ((child = m_labelLayout->takeAt(0)) != 0) {
if (child->widget())
child->widget()->deleteLater();
delete child;
}
while ((child = m_contentLayout->takeAt(0)) != 0) {
if (child->widget())
child->widget()->deleteLater();
delete child;
}
2018-01-26 18:20:43 +08:00
delete m_layout;
}
void CpuRateWidget::initWidgets()
{
QWidget *w = new QWidget;
// w->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
m_labelLayout = new QVBoxLayout(w);
m_labelLayout->setContentsMargins(0, 0, 0, 0);
m_labelLayout->setSpacing(0);
QLabel *m_title = new QLabel(tr("CPU"));
m_title->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
m_title->setStyleSheet("background:transparent;font-size:24px;color:#000000");
m_cpuRateTitle = new QLabel;
m_cpuRateTitle->setStyleSheet("QLabel{background:transparent;font-size:12px;color:#999999;}");
m_cpuRateTitle->setText(tr("Occupancy rate"));
m_cpuRateText = new QLabel;
m_cpuRateText->setStyleSheet("QLabel{background:transparent;font-size:20px;color:#000000;}");
m_cpuIdleRateTitle = new QLabel;
m_cpuIdleRateTitle->setStyleSheet("QLabel{background:transparent;font-size:12px;color:#999999;}");
m_cpuIdleRateTitle->setText(tr("Idle rate"));
m_cpuIdleRateText = new QLabel;
m_cpuIdleRateText->setStyleSheet("QLabel{background:transparent;font-size:20px;color:#000000;}");
m_cpuRunTimeTitle = new QLabel;
m_cpuRunTimeTitle->setStyleSheet("QLabel{background:transparent;font-size:12px;color:#999999;}");
m_cpuRunTimeTitle->setText(tr("The running time of system"));
m_cpuRunTimeText = new QLabel;
m_cpuRunTimeText->setStyleSheet("QLabel{background:transparent;font-size:20px;color:#000000;}");
m_cpuIdleTimeTitle = new QLabel;
m_cpuIdleTimeTitle->setStyleSheet("QLabel{background:transparent;font-size:12px;color:#999999;}");
m_cpuIdleTimeTitle->setText(tr("The idle time of system"));
m_cpuIdleTimeText = new QLabel;
m_cpuIdleTimeText->setStyleSheet("QLabel{background:transparent;font-size:20px;color:#000000;}");
QVBoxLayout *cpuRateLayout = new QVBoxLayout;
cpuRateLayout->setSpacing(10);
cpuRateLayout->addWidget(m_cpuRateTitle);
cpuRateLayout->addWidget(m_cpuRateText);
QVBoxLayout *cpuIdleRateLayout = new QVBoxLayout;
cpuIdleRateLayout->setSpacing(10);
cpuIdleRateLayout->addWidget(m_cpuIdleRateTitle);
cpuIdleRateLayout->addWidget(m_cpuIdleRateText);
QHBoxLayout *rateLayout = new QHBoxLayout;
rateLayout->setSpacing(30);
rateLayout->addLayout(cpuRateLayout);
rateLayout->addLayout(cpuIdleRateLayout);
QVBoxLayout *cpuRunTimeLayout = new QVBoxLayout;
cpuRunTimeLayout->setSpacing(10);
cpuRunTimeLayout->addWidget(m_cpuRunTimeTitle);
cpuRunTimeLayout->addWidget(m_cpuRunTimeText);
QVBoxLayout *cpuIdleTimeLayout = new QVBoxLayout;
cpuIdleTimeLayout->setSpacing(10);
cpuIdleTimeLayout->addWidget(m_cpuIdleTimeTitle);
cpuIdleTimeLayout->addWidget(m_cpuIdleTimeText);
2018-01-30 17:09:06 +08:00
2018-01-26 18:20:43 +08:00
m_labelLayout->setContentsMargins(0, 0, 0, 0);
m_labelLayout->setSpacing(10);
m_labelLayout->addWidget(m_title);
m_labelLayout->addLayout(rateLayout);
m_labelLayout->addLayout(cpuRunTimeLayout);
m_labelLayout->addLayout(cpuIdleTimeLayout);
m_contentLayout->addWidget(w, 1, Qt::AlignLeft);
m_cpuBall = new CpuBallWidget;
m_contentLayout->addWidget(m_cpuBall);
}
void CpuRateWidget::refreshData(double cpu)
{
m_cpuRateText->setText(QString::number(cpu, 'f', 1) + "%");
unsigned long runtime;
unsigned long idletime;
QString rate = getIdelRate(runtime, idletime);
m_cpuIdleRateText->setText(rate);
m_cpuRunTimeText->setText(convertTimeToString(runtime));
m_cpuIdleTimeText->setText(convertTimeToString(idletime));
2018-01-17 11:45:16 +08:00
}
2018-01-25 18:58:26 +08:00
void CpuRateWidget::onUpdateCpuPercent(double value)
2018-01-17 11:45:16 +08:00
{
2018-01-26 18:20:43 +08:00
this->refreshData(value);
2018-01-17 11:45:16 +08:00
m_cpuBall->updateCpuPercent(value);
}
2018-01-25 18:58:26 +08:00
void CpuRateWidget::startTimer()
2018-01-17 11:45:16 +08:00
{
m_cpuBall->startTimer();
}
2018-01-25 18:58:26 +08:00
void CpuRateWidget::stopTimer()
2018-01-17 11:45:16 +08:00
{
m_cpuBall->stopTimer();
}