1. 添加JSON解析扩展库; 2. 广播支持特定的JSON格式数据发送; 3. 更新HxTask操作方法: wait,invoke

This commit is contained in:
hehaoyang 2024-01-21 22:06:55 +08:00
parent 46e7e79987
commit e827eb150a
7 changed files with 172 additions and 39 deletions

View File

@ -1,10 +1,12 @@
#include "HxBroadcast.h" #include "HxBroadcast.h"
#include <QHostAddress> #include <QHostAddress>
#include <QJsonDocument>
#include <QJsonObject>
HxBroadcast *broadcast = nullptr; HxBroadcast *broadcast = nullptr;
HxBroadcast* HxBroadcast::context() { return broadcast; } HxBroadcast *HxBroadcast::context() { return broadcast; }
void HxBroadcast::initialization(int port) void HxBroadcast::initialization(int port)
{ {
@ -16,15 +18,22 @@ void HxBroadcast::initialization(int port)
connect(broadcast, &HxBroadcast::publish_event, broadcast, &HxBroadcast::publish_achieve); connect(broadcast, &HxBroadcast::publish_event, broadcast, &HxBroadcast::publish_achieve);
} }
void HxBroadcast::publish(QString message) void HxBroadcast::publish(QString message) { emit broadcast->publish_event(message); }
void HxBroadcast::publish_json(int action_type, std::initializer_list<QPair<QString, QJsonValue>> args)
{ {
emit broadcast->publish_event(message); QJsonObject root, msginfo;
for (std::initializer_list<QPair<QString, QJsonValue>>::const_iterator i = args.begin(); i != args.end(); ++i)
msginfo.insert(i->first, i->second);
root.insert("action_type", action_type);
root.insert("msgInfo", msginfo);
publish(QJsonDocument(root).toJson(QJsonDocument::Compact));
} }
void HxBroadcast::publish_achieve(QString message) void HxBroadcast::publish_achieve(QString message) { socket->writeDatagram(message.toUtf8(), QHostAddress::Broadcast, broadcast->port); }
{
socket->writeDatagram(message.toUtf8(), QHostAddress::Broadcast, broadcast->port);
}
void HxBroadcast::receive_ready_read() void HxBroadcast::receive_ready_read()
{ {
@ -36,9 +45,9 @@ void HxBroadcast::receive_ready_read()
/* 让datagram的大小为等待处理的数据报的大小这样才能接收到完整的数据 */ /* 让datagram的大小为等待处理的数据报的大小这样才能接收到完整的数据 */
datagram.resize(socket->pendingDatagramSize()); datagram.resize(socket->pendingDatagramSize());
/* 接收数据报将其存放到datagram中*/ /* 接收数据报将其存放到datagram中 */
socket->readDatagram(datagram.data(), datagram.size()); socket->readDatagram(datagram.data(), datagram.size());
emit broadcast->receive_event(QString::fromLocal8Bit(datagram)); emit broadcast->receive_event(datagram);
} }
} }

View File

@ -24,12 +24,20 @@ public:
*/ */
static void publish(QString message); static void publish(QString message);
/**
* @brief (JSON格式)
*
* @param action_type
* @param args msgInfo
*/
static void publish_json(int action_type, std::initializer_list<QPair<QString, QJsonValue>> args = std::initializer_list<QPair<QString, QJsonValue>>());
private: private:
void publish_achieve(QString message); void publish_achieve(QString message);
signals: signals:
void publish_event(QString message); void publish_event(QString message);
void receive_event(QString data); void receive_event(QByteArray data);
private slots: private slots:
void receive_ready_read(); void receive_ready_read();

57
HxJson.cpp Normal file
View File

@ -0,0 +1,57 @@
#include "HxJson.h"
#include <QVariant>
int HxJson::to_int(QJsonObject object, QString key)
{
auto value = object.value(key);
switch(value.type())
{
case QJsonValue::Double:
return qRound(value.toDouble());
case QJsonValue::String:
return value.toString().toInt();
default:
return 0;
}
}
bool HxJson::to_boolean(QJsonObject object, QString key)
{
auto value = object.value(key);
switch(value.type())
{
case QJsonValue::Bool:
return value.toBool();
case QJsonValue::String:
return QVariant(value.toString()).toBool();
default:
return false;
}
}
QString HxJson::to_string(QJsonObject object, QString key)
{
auto value = object.value(key);
switch(value.type())
{
case QJsonValue::Bool:
case QJsonValue::Double:
return QString::number(value.toDouble());
case QJsonValue::String:
return value.toString();
default:
return "";
}
}
QStringList HxJson::to_string_list(QJsonObject object, QString key, QString split){ return to_string(object, key).split(split);}

15
HxJson.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef HXJSON_H
#define HXJSON_H
#include <QJsonObject>
class HxJson
{
public:
static int to_int(QJsonObject object, QString key);
static bool to_boolean(QJsonObject object, QString key);
static QString to_string(QJsonObject object, QString key);
static QStringList to_string_list(QJsonObject object, QString key, QString split);
};
#endif // HXJSON_H

View File

@ -2,7 +2,9 @@
#include "HxProcess.h" #include "HxProcess.h"
#include <QSettings> #include <QSettings>
#ifdef Q_OS_LINUX
#include <unistd.h> #include <unistd.h>
#endif
static double m_memory_total = 0; static double m_memory_total = 0;
static double m_cpu_total = 0, m_cpu_use = 0; static double m_cpu_total = 0, m_cpu_use = 0;
@ -110,6 +112,7 @@ bool HxSystem::get_memory_status(double *memory_use, double *memory_total, doubl
bool HxSystem::get_program_status(double *cpu_usage, double *virtual_memory, double *resident_memory) bool HxSystem::get_program_status(double *cpu_usage, double *virtual_memory, double *resident_memory)
{ {
#ifdef Q_OS_LINUX
auto result = HxProcess::start(QString("ps u %1").arg(getpid())); auto result = HxProcess::start(QString("ps u %1").arg(getpid()));
auto list = result.split("\n"); auto list = result.split("\n");
@ -126,6 +129,7 @@ bool HxSystem::get_program_status(double *cpu_usage, double *virtual_memory, dou
return true; return true;
} }
#endif
return false; return false;
} }
@ -189,6 +193,7 @@ bool HxSystem::get_harddisk_temperature(QString file_system, QString *temperatur
bool HxSystem::get_harddisk_smart(QString file_system, QString *smart) bool HxSystem::get_harddisk_smart(QString file_system, QString *smart)
{ {
#ifdef Q_OS_LINUX
auto result = HxProcess::start(QString("echo tvis | sudo -S smartctl -i %1 | grep 'SMART support is'").arg(file_system)); auto result = HxProcess::start(QString("echo tvis | sudo -S smartctl -i %1 | grep 'SMART support is'").arg(file_system));
if(result.indexOf("Unavailable") != -1) if(result.indexOf("Unavailable") != -1)
{ {
@ -212,7 +217,7 @@ bool HxSystem::get_harddisk_smart(QString file_system, QString *smart)
} }
else else
return false; return false;
#endif
return true; return true;
} }

View File

@ -2,8 +2,6 @@
#define HXTASK_H #define HXTASK_H
#include "HxTrace.h" #include "HxTrace.h"
//#include "HxThread.h"
#include <QtConcurrent> #include <QtConcurrent>
class HxTask class HxTask
@ -22,14 +20,70 @@ public:
} }
/** /**
* @brief * @brief
* @param object * @param functor , bool
* @param fn * @param millisecond
*/ */
template <typename Functor> template <typename Functor>
static QFuture<void> invoke(Functor functor) static bool wait(Functor functor, int millisecond)
{ {
return QtConcurrent::run(functor); auto timestamp = QDateTime::currentDateTime();
while(!functor())
{
if (QDateTime::currentDateTime() > timestamp.addMSecs(millisecond))
return false;
QThread::msleep(10);
}
return true;
}
template <typename Functor, typename Arg1>
static QFuture<void> invoke(Functor functor, const Arg1 &arg1) { return QtConcurrent::run(functor, arg1); }
template <typename Functor, typename Arg1, typename Arg2>
static QFuture<void> invoke(Functor functor, const Arg1 &arg1, const Arg2 &arg2) { return QtConcurrent::run(functor, arg1, arg2); }
template <typename Functor, typename Arg1, typename Arg2, typename Arg3>
static QFuture<void> invoke(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) { return QtConcurrent::run(functor, arg1, arg2, arg3); }
/**
* @brief
* @param functor
*/
template <typename Functor>
static QFuture<void> invoke(Functor functor) { return QtConcurrent::run(functor); }
/**
* @brief
* @param functor
* @param millisecond
* @param uuid
*/
template <typename Functor>
static void run(Functor functor, int millisecond, QUuid uuid)
{
dispatchers.insert(uuid, true);
QtConcurrent::run(
[=](Functor functor, int _millisecond, QUuid _uuid)
{
HxTrace::debug_write_line("HxTask", QString("Thread: %1, start").arg(_uuid.toString()));
while (dispatchers[_uuid])
{
functor();
QThread::msleep(_millisecond);
}
HxTrace::debug_write_line("HxTask", QString("Thread: %1, stop").arg(_uuid.toString()));
dispatchers.remove(_uuid);
},
functor, millisecond, uuid);
} }
/** /**
@ -50,18 +104,18 @@ public:
/** /**
* @brief 线 * @brief 线
* @param uuid
* @param object * @param object
* @param fn * @param fn
* @param millisecond * @param millisecond
* @param uuid
*/ */
template <typename T, typename Class> template <typename T, typename Class>
static void run(QUuid uuid, Class *object, T (Class::*fn)(), int millisecond) static void run(Class *object, T (Class::*fn)(), int millisecond, QUuid uuid)
{ {
dispatchers.insert(uuid, true); dispatchers.insert(uuid, true);
QtConcurrent::run( QtConcurrent::run(
[=](QUuid _uuid, Class *_object, T (Class::*_fn)(), int _millisecond) [=](Class *_object, T (Class::*_fn)(), int _millisecond, QUuid _uuid)
{ {
HxTrace::debug_write_line("HxTask", QString("Thread: %1, start").arg(_uuid.toString())); HxTrace::debug_write_line("HxTask", QString("Thread: %1, start").arg(_uuid.toString()));
@ -76,7 +130,7 @@ public:
dispatchers.remove(_uuid); dispatchers.remove(_uuid);
}, },
uuid, object, fn, millisecond); object, fn, millisecond, uuid);
} }
/** /**
@ -171,21 +225,4 @@ private:
static QMap<QUuid, bool> dispatchers; static QMap<QUuid, bool> dispatchers;
}; };
class HxParalle
{
public:
/**
* @brief
* @param object
* @param fn1 1
* @param fn2 2
*/
template <typename T, typename Class>
static void invoke(Class *object, T (Class::*fn1)(), T (Class::*fn2)())
{
HxTask::run(object, fn1);
HxTask::run(object, fn2);
}
};
#endif // HXTASK_H #endif // HXTASK_H

View File

@ -31,6 +31,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \ SOURCES += \
HxBroadcast.cpp \ HxBroadcast.cpp \
HxDisk.cpp \ HxDisk.cpp \
HxJson.cpp \
HxLog.cpp \ HxLog.cpp \
HxProcess.cpp \ HxProcess.cpp \
HxSocket.cpp \ HxSocket.cpp \
@ -43,6 +44,7 @@ SOURCES += \
HEADERS += \ HEADERS += \
HxBroadcast.h \ HxBroadcast.h \
HxDisk.h \ HxDisk.h \
HxJson.h \
HxLog.h \ HxLog.h \
HxProcess.h \ HxProcess.h \
HxSocket.h \ HxSocket.h \