feat:DataManager添加本地数据模拟模块

This commit is contained in:
duanshengchao 2025-08-21 17:23:52 +08:00
parent a39e745617
commit 59faca3046
6 changed files with 46 additions and 16 deletions

View File

@ -1,4 +1,5 @@
#include "dpLineChart.h" #include "dpLineChart.h"
#include "dataManager.h"
//#define useDefaultAxis_Y //默认轴不可删除、不可左右移动所以做动态管理尤其是动态排列时要考虑的比较复杂可以采用不使用的策略全部以自定义轴替代默认轴yAxis只在初始化和没有实际数据轴自定义时显示用来做外观展示 //#define useDefaultAxis_Y //默认轴不可删除、不可左右移动所以做动态管理尤其是动态排列时要考虑的比较复杂可以采用不使用的策略全部以自定义轴替代默认轴yAxis只在初始化和没有实际数据轴自定义时显示用来做外观展示
dpLineChart::dpLineChart(QWidget* parent) dpLineChart::dpLineChart(QWidget* parent)
@ -18,6 +19,8 @@ dpLineChart::dpLineChart(QWidget* parent)
mainLayout->setContentsMargins(0, 1, 0, 0); mainLayout->setContentsMargins(0, 1, 0, 0);
mainLayout->addWidget(m_pCustomPlot); mainLayout->addWidget(m_pCustomPlot);
setLayout(mainLayout); setLayout(mainLayout);
connect(DataManager::instance(), &DataManager::dataUpdated, this, &dpLineChart::onSignal_dataUpdated);
} }
dpLineChart::~dpLineChart() dpLineChart::~dpLineChart()
@ -247,6 +250,9 @@ void dpLineChart::setDateTime(const QDateTime& dateTime)
} }
it.value().qGraph->addData(timeValue, randomFloat); it.value().qGraph->addData(timeValue, randomFloat);
} }
// for(auto it = m_graphs.begin(); it != m_graphs.end(); ++it)
// DataManager::instance()->requestData(it.key(), this);
} }
m_pCustomPlot->xAxis->setRange(timeValue, m_timeRange / 1000.0, Qt::AlignRight); m_pCustomPlot->xAxis->setRange(timeValue, m_timeRange / 1000.0, Qt::AlignRight);
@ -499,3 +505,28 @@ void dpLineChart::onSignal_rangeChanged_xAxis(const QCPRange& range)
if(m_timeRange != range.size() * 1000) if(m_timeRange != range.size() * 1000)
m_timeRange = range.size() * 1000; m_timeRange = range.size() * 1000;
} }
void dpLineChart::onSignal_dataUpdated(const QString& dataID, const QVariant& data, const QDateTime& timestamp)
{
auto it = m_graphs.find(dataID);
if(it != m_graphs.end())
{
static double marginFactor = 1.0;
double dData = data.toDouble();
//调整所在轴的范围
QCPRange range = it.value().qGraph->valueAxis()->range();
if(dData > range.upper)
{
double upper = dData + marginFactor;
it.value().qGraph->valueAxis()->setRangeUpper(upper);
}
else if(dData < range.lower)
{
double lower = dData - marginFactor;
it.value().qGraph->valueAxis()->setRangeLower(lower);
}
qint64 timeValue = timestamp.toMSecsSinceEpoch() / 1000.0;
it.value().qGraph->addData(timeValue, dData);
}
}

View File

@ -31,6 +31,7 @@ public:
public slots: public slots:
void onSignal_rangeChanged_xAxis(const QCPRange&); void onSignal_rangeChanged_xAxis(const QCPRange&);
void onSignal_dataUpdated(const QString& dataKey, const QVariant& data, const QDateTime& timestamp);
private: private:
//处理关联图形的策略 //处理关联图形的策略

View File

@ -5,6 +5,7 @@
#include <QHash> #include <QHash>
#include <QQueue> #include <QQueue>
#include <QVariant> #include <QVariant>
#include <QPointer>
#include <QTimer> #include <QTimer>
#include <QDateTime> #include <QDateTime>
#include <QMutexLocker> #include <QMutexLocker>
@ -38,7 +39,7 @@ public:
HttpRequestManager* httpManager(); HttpRequestManager* httpManager();
signals: signals:
void dataUpdated(const QString& dataKey, const QVariant& data); void dataUpdated(const QString& dataKey, const QVariant& data, const QDateTime& timestamp);
void cacheInvalidated(const QString& dataKey); void cacheInvalidated(const QString& dataKey);
public slots: public slots:
@ -52,7 +53,8 @@ private:
struct RequestInfo struct RequestInfo
{ {
QString dataKey; QString dataKey;
QObject* requester; //QObject* requester;
QPointer<QObject> requester;
}; };
explicit DataManager(); explicit DataManager();

View File

@ -33,7 +33,7 @@ void DataManager::triggerDataUpdate(const QString& dataKey)
m_httpManager->requestData(dataKey); m_httpManager->requestData(dataKey);
else else
{ {
QThreadPool::globalInstance()->start([weakThis = QPointer<DataManager>(this), dataKey]() { QThreadPool::globalInstance()->start([weakThis = QPointer<DataManager>(this), dataKey]() { //多线程中采用QPointer可以防止垂悬指针的问题此处可以不用但是建议习惯性的这样写
if(weakThis.isNull()) if(weakThis.isNull())
return; return;
@ -67,7 +67,7 @@ void DataManager::triggerDataUpdate(const QString& dataKey)
{ {
entry.data = newData; entry.data = newData;
entry.timestamp = QDateTime::currentDateTime(); entry.timestamp = QDateTime::currentDateTime();
emit weakThis->dataUpdated(dataKey, newData); emit weakThis->dataUpdated(dataKey, newData, entry.timestamp);
} }
entry.isUpdating = false; entry.isUpdating = false;
} }
@ -166,7 +166,11 @@ void DataManager::processRequestQueue()
//按数据类型进行分组,减少更新频率 //按数据类型进行分组,减少更新频率
QMap<QString, QSet<QObject*>> groupedRequests; QMap<QString, QSet<QObject*>> groupedRequests;
for(const auto& req : requests) for(const auto& req : requests)
{
if(req.requester.isNull())
continue;
groupedRequests[req.dataKey].insert(req.requester); groupedRequests[req.dataKey].insert(req.requester);
}
QSet<QString> needsUpdate; QSet<QString> needsUpdate;
QDateTime curTime = QDateTime::currentDateTime(); QDateTime curTime = QDateTime::currentDateTime();
@ -195,7 +199,7 @@ void DataManager::processRequestQueue()
{ {
entry.isUpdating = true; entry.isUpdating = true;
m_pendingUpdates.insert(dataKey); m_pendingUpdates.insert(dataKey);
needsUpdate.insert(dataKey); needsUpdate.insert(dataKey); //本地数据无需加锁,减少锁范围
} }
} }
} //写锁在这里自动释放 } //写锁在这里自动释放
@ -216,7 +220,7 @@ void DataManager::handleHttpDataReceived(const QString& dataKey, const QVariant&
entry.timestamp = QDateTime::currentDateTime(); entry.timestamp = QDateTime::currentDateTime();
entry.isUpdating = false; entry.isUpdating = false;
emit dataUpdated(dataKey, data); emit dataUpdated(dataKey, data, entry.timestamp);
} }
m_pendingUpdates.remove(dataKey); m_pendingUpdates.remove(dataKey);

View File

@ -26,13 +26,10 @@ void PanelSelectionDialog::initList()
{ {
ui->listWidget->clear(); ui->listWidget->clear();
QListWidgetItem* item = new QListWidgetItem(QString::fromWCharArray(L"线图")); QListWidgetItem* item = new QListWidgetItem(QString::fromWCharArray(L"线图"));
item->setData(Qt::UserRole + panelTye, lineChart); item->setData(Qt::UserRole + panelTye, lineChart);
ui->listWidget->addItem(item); ui->listWidget->addItem(item);
item = new QListWidgetItem(QString::fromWCharArray(L"曲线图")); item = new QListWidgetItem(QString::fromWCharArray(L"直方图"));
item->setData(Qt::UserRole + panelTye, curveChart);
ui->listWidget->addItem(item);
item = new QListWidgetItem(QString::fromWCharArray(L"柱状图"));
item->setData(Qt::UserRole + panelTye, barChart); item->setData(Qt::UserRole + panelTye, barChart);
ui->listWidget->addItem(item); ui->listWidget->addItem(item);
item = new QListWidgetItem(QString::fromWCharArray(L"点状图")); item = new QListWidgetItem(QString::fromWCharArray(L"点状图"));

View File

@ -170,11 +170,6 @@ background-color:rgb(67,160,249);
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum> <enum>Qt::FocusPolicy::NoFocus</enum>
</property> </property>
<item>
<property name="text">
<string>折线图</string>
</property>
</item>
<item> <item>
<property name="text"> <property name="text">
<string>曲线图</string> <string>曲线图</string>