From 81cba45eb251df4027360ad48a4cad40576439a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B5=B7?= Date: Wed, 22 Apr 2026 11:36:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=8B=E9=87=8Fgvf?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8F=91=E9=80=81=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MeasureServer.cpp | 5 +++ src/MeasureServer.h | 1 + src/RequstDataProcesser.cpp | 19 ++++---- src/RequstDataProcesser.h | 6 +++ src/SyncGvfFileDataTask.cpp | 89 +++++++++++++++++++++++++++++++++++++ src/SyncGvfFileDataTask.h | 28 ++++++++++++ 6 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 src/SyncGvfFileDataTask.cpp create mode 100644 src/SyncGvfFileDataTask.h diff --git a/src/MeasureServer.cpp b/src/MeasureServer.cpp index 7bc0cd8..fda1c4a 100644 --- a/src/MeasureServer.cpp +++ b/src/MeasureServer.cpp @@ -42,6 +42,11 @@ MeasureSession::MeasureSession(int socket_descriptor, QObject* parent) { } +MeasureSession::~MeasureSession() +{ + QLOG_DEBUG() << QStringLiteral(u"~MeasureSession"); +} + void MeasureSession::run() { // 在子线程中创建套接字(关键:必须在当前线程创建) diff --git a/src/MeasureServer.h b/src/MeasureServer.h index 5e72638..c9c813b 100644 --- a/src/MeasureServer.h +++ b/src/MeasureServer.h @@ -27,6 +27,7 @@ class MeasureSession : public QThread public: MeasureSession(int socket_descriptor, QObject *parent = nullptr); + virtual ~MeasureSession(); void run() override; diff --git a/src/RequstDataProcesser.cpp b/src/RequstDataProcesser.cpp index cd9fbcf..e656001 100644 --- a/src/RequstDataProcesser.cpp +++ b/src/RequstDataProcesser.cpp @@ -12,6 +12,14 @@ RequstDataProcesser::RequstDataProcesser(QObject *parent) : QTcpSocket{parent} { + sync_gvf_data_task = new SyncGvfFileDataTask(this); + connect(sync_gvf_data_task, &SyncGvfFileDataTask::syncGvfData, this, &RequstDataProcesser::OnReplayClient/*, Qt::QueuedConnection*/); + connect(this, &RequstDataProcesser::stopSyncGvfFileDataTask, sync_gvf_data_task, &SyncGvfFileDataTask::OnStop); +} + +RequstDataProcesser::~RequstDataProcesser() +{ + QLOG_DEBUG() << QStringLiteral(u"~RequstDataProcesser"); } void RequstDataProcesser::OnReplayClient(const QByteArray& replay_data) @@ -116,10 +124,7 @@ void RequstDataProcesser::processStartMeasureCmd(const QString& device_guid, con replay_info = QStringLiteral(u"测量数据GVF文件未找到"); } else { replay_info = measure_data_gvf_filename; - SyncGvfFileDataTask* sync_gvf_data_task = new SyncGvfFileDataTask; - connect(sync_gvf_data_task, &SyncGvfFileDataTask::finished, sync_gvf_data_task, &SyncGvfFileDataTask::deleteLater); - connect(sync_gvf_data_task, &SyncGvfFileDataTask::syncGvfData, this, &RequstDataProcesser::OnReplayClient); - connect(this, &RequstDataProcesser::stopSyncGvfFileDataTask, sync_gvf_data_task, &SyncGvfFileDataTask::OnStop); + sync_gvf_data_task->SetGvfFilename(measure_data_gvf_filename); sync_gvf_data_task->start(); } QByteArray replay_data; @@ -127,11 +132,7 @@ void RequstDataProcesser::processStartMeasureCmd(const QString& device_guid, con replay_data_stream << QString("START") << ok << replay_info; QMetaObject::invokeMethod(this, "OnReplayClient", Qt::QueuedConnection, Q_ARG(QByteArray, replay_data)); } - - SyncGvfFileDataTask* sync_gvf_data_task = new SyncGvfFileDataTask; - connect(sync_gvf_data_task, &SyncGvfFileDataTask::finished, sync_gvf_data_task, &SyncGvfFileDataTask::deleteLater, Qt::DirectConnection); - connect(sync_gvf_data_task, &SyncGvfFileDataTask::syncGvfData, this, &RequstDataProcesser::OnReplayClient, Qt::QueuedConnection); - connect(this, &RequstDataProcesser::stopSyncGvfFileDataTask, sync_gvf_data_task, &SyncGvfFileDataTask::OnStop, Qt::DirectConnection); + sync_gvf_data_task->SetGvfFilename("D:/Workspace/EnergySpectrumAnalyerProject/TestData/GVHD__2025_10_16_16_00_39_653.gvf"); sync_gvf_data_task->start(); } diff --git a/src/RequstDataProcesser.h b/src/RequstDataProcesser.h index fff7ab9..216d8c2 100644 --- a/src/RequstDataProcesser.h +++ b/src/RequstDataProcesser.h @@ -4,11 +4,14 @@ #include #include +class SyncGvfFileDataTask; + class RequstDataProcesser : public QTcpSocket { Q_OBJECT public: explicit RequstDataProcesser(QObject *parent = nullptr); + virtual ~RequstDataProcesser(); void ProcessRequstData(const QByteArray& requst_data); @@ -24,6 +27,9 @@ private: void processSetDeviceMeasureConfigParamsCmd(const QString& device_guid, const QString& cmd_data); void processClearDataCmd( const QString& device_guid); void processGetMeasureDeviceListCmd(); + +private: + SyncGvfFileDataTask* sync_gvf_data_task; }; #endif // REQUSTDATAPROCESSER_H diff --git a/src/SyncGvfFileDataTask.cpp b/src/SyncGvfFileDataTask.cpp new file mode 100644 index 0000000..7c43dcf --- /dev/null +++ b/src/SyncGvfFileDataTask.cpp @@ -0,0 +1,89 @@ +#include "SyncGvfFileDataTask.h" +#include "QsLogManage.h" +#include +#include +#include +#include +#include +#include +#include + + +SyncGvfFileDataTask::SyncGvfFileDataTask(QObject *parent) + : QThread{parent}, _b_stop(true) +{ +} + +SyncGvfFileDataTask::~SyncGvfFileDataTask() +{ + _b_stop = true; + if ( this->isRunning() ) + this->wait(3000); + QLOG_DEBUG() << QStringLiteral(u"~SyncGvfFileDataTask()"); +} + +void SyncGvfFileDataTask::SetGvfFilename(const QString &gvf_filename) +{ + _gvf_filename = gvf_filename; +} + +void SyncGvfFileDataTask::run() +{ + if (_gvf_filename.isEmpty()) { + QLOG_WARN() << QStringLiteral(u"没有GVF测量数据文件"); + return; + } + QFileInfo gvf_file_info(_gvf_filename); + if (!gvf_file_info.exists()) { + QLOG_WARN() << QStringLiteral(u"GVF测量数据文件%1不存在").arg(_gvf_filename); + return; + } + const QString& connect_name = gvf_file_info.baseName(); + if ( QSqlDatabase::contains(connect_name) ) { + QSqlDatabase::removeDatabase(connect_name); + } + QSqlDatabase gvf_db = QSqlDatabase::addDatabase("QSQLITE", connect_name); + gvf_db.setDatabaseName(_gvf_filename); + if (!gvf_db.open()) { + QLOG_WARN() << QStringLiteral(u"打开读取连接失败: %1").arg(gvf_db.lastError().text()); + return; + } + quint64 current_process_data_id = 0; + _b_stop = false; + while (!_b_stop) { + QSqlQuery query(gvf_db); + query.exec("SELECT recordnum FROM lmstatisticinfov2"); + if (query.last()) { + quint64 record_num = query.value("recordnum").toULongLong(); + QLOG_DEBUG() << QStringLiteral(u"测量数据记录总数: %1").arg(record_num); + } + + query.exec(QString("SELECT id, data FROM lmdatainfov2 WHERE id > %1").arg(current_process_data_id )); + int data_record_count = 0; + while (bool(!_b_stop) && query.next()) { + quint64 id = query.value("id").toULongLong(); + const QByteArray& data = query.value("data").toByteArray(); + if (id > current_process_data_id) + current_process_data_id = id; + ++data_record_count; + QByteArray gvf_data; + QDataStream replay_data_stream(&gvf_data, QIODevice::Append); + replay_data_stream << QString("GVF") << true << data.size(); + replay_data_stream.writeRawData(data.data(), data.size()); + QLOG_DEBUG() << QStringLiteral(u"GVFDATA: %1").arg(QString::fromUtf8(data.toHex().toUpper())); + emit syncGvfData(gvf_data); + QThread::sleep(1); + } + query.clear(); + query.finish(); + } + gvf_db.close(); + QSqlDatabase::removeDatabase(connect_name); + QLOG_DEBUG() << QStringLiteral(u"SyncGvfFileDataTask执行完成退出"); +} + +void SyncGvfFileDataTask::OnStop() +{ + _b_stop = true; + QLOG_DEBUG() << QStringLiteral(u"停止SyncGvfFileDataTask"); +} diff --git a/src/SyncGvfFileDataTask.h b/src/SyncGvfFileDataTask.h new file mode 100644 index 0000000..fc7de52 --- /dev/null +++ b/src/SyncGvfFileDataTask.h @@ -0,0 +1,28 @@ +#ifndef SYNCGVFFILEDATATASK_H +#define SYNCGVFFILEDATATASK_H + +#include +#include + +class SyncGvfFileDataTask : public QThread +{ + Q_OBJECT +public: + explicit SyncGvfFileDataTask(QObject *parent = nullptr); + virtual ~SyncGvfFileDataTask(); + + void SetGvfFilename(const QString& gvf_filename); + void run() override; + +public slots: + void OnStop(); + +signals: + void syncGvfData(const QByteArray& data); + +private: + QString _gvf_filename; + bool _b_stop; +}; + +#endif // SYNCGVFFILEDATATASK_H