fix:修复MeasurementDataManager析构时出现的'QObject::startTimer: Timers can only be used with threads started with QThread‘错误

This commit is contained in:
duanshengchao 2026-02-05 19:08:00 +08:00
parent dad06a43d9
commit e81a701414
6 changed files with 53 additions and 14 deletions

View File

@ -211,7 +211,8 @@ void dpBarsChart::setDateTime(const QDateTime& dateTime)
if(data.timestamp == 0) if(data.timestamp == 0)
continue; continue;
static double marginFactor = 1.0; //qDebug() << it.key() << ": " << data.value;
static double marginFactor = 0.0;
double dData = data.value; double dData = data.value;
Bars bar = it.value(); Bars bar = it.value();
//调整所在轴的范围 //调整所在轴的范围

View File

@ -5,7 +5,6 @@
#include <QObject> #include <QObject>
#include <QHash> #include <QHash>
#include <QUrl> #include <QUrl>
#include <QTimer>
class QSettings; class QSettings;
class QNetworkAccessManager; class QNetworkAccessManager;
@ -19,6 +18,7 @@ class MeasurementDataManager : public QObject
public: public:
static MeasurementDataManager* instance(); static MeasurementDataManager* instance();
static void destroyInstance();
void requestData(const QStringList& measurements, QObject* requester); void requestData(const QStringList& measurements, QObject* requester);
void cancelRequest(const QStringList& measurements, QObject* requester); void cancelRequest(const QStringList& measurements, QObject* requester);
@ -71,6 +71,20 @@ private:
explicit MeasurementDataManager(); explicit MeasurementDataManager();
~MeasurementDataManager(); ~MeasurementDataManager();
static MeasurementDataManager* m_instance;
class CGarbo
{
public:
CGarbo() {};
~CGarbo()
{
if(m_instance)
delete m_instance;
m_instance = nullptr;
}
};
void initialize(); void initialize();
//实时数据 //实时数据
void buildSubscriptionRequest(const QString& action, const QStringList& measurements); void buildSubscriptionRequest(const QString& action, const QStringList& measurements);

View File

@ -4,6 +4,7 @@
#include "networkCommon.h" #include "networkCommon.h"
#include <QObject> #include <QObject>
#include <QWebSocket> #include <QWebSocket>
#include <QTimer>
struct MeasurementDataPoint struct MeasurementDataPoint
{ {
@ -59,7 +60,6 @@ private:
* *
* WebSocket连接 * WebSocket连接
*/ */
class QTimer;
class WebSocketClient : public QObject class WebSocketClient : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -97,7 +97,7 @@ private:
QUrl m_serverUrl; QUrl m_serverUrl;
//重连相关 //重连相关
QTimer* m_reconnectTimer; QTimer m_reconnectTimer;
int m_reconnectInterval; int m_reconnectInterval;
int m_reconnectAttempts; int m_reconnectAttempts;
int m_maxReconnectAttempts; int m_maxReconnectAttempts;

View File

@ -3,6 +3,7 @@
#include <QApplication> #include <QApplication>
#include <QScreen> #include <QScreen>
#include <QSysInfo> #include <QSysInfo>
#include "measurementDataManager.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -28,5 +29,7 @@ int main(int argc, char *argv[])
QApplication a(argc, argv); QApplication a(argc, argv);
MainWindow w; MainWindow w;
w.showMaximized(); w.showMaximized();
return a.exec(); int ret = a.exec();
MeasurementDataManager::destroyInstance();
return ret;
} }

View File

@ -14,10 +14,25 @@
#include <QJsonParseError> #include <QJsonParseError>
#include <QCoreApplication> #include <QCoreApplication>
MeasurementDataManager* MeasurementDataManager::m_instance = nullptr;
MeasurementDataManager* MeasurementDataManager::instance() MeasurementDataManager* MeasurementDataManager::instance()
{ {
static MeasurementDataManager instance; // static MeasurementDataManager instance;
return &instance; // return &instance;
//不采用静态局部变量的方式实现因为QTimer析构时需要依赖事件循环静态局部变量的释放实在main函数之后此时事件循环已退出(app.exec())
//所以增加destroyInstance()在main函数退出之前显示调用即可规避此问题
if(!m_instance)
m_instance = new MeasurementDataManager();
return m_instance;
}
void MeasurementDataManager::destroyInstance()
{
if(m_instance)
delete m_instance;
m_instance = nullptr;
} }
MeasurementDataManager::MeasurementDataManager() MeasurementDataManager::MeasurementDataManager()
@ -25,12 +40,14 @@ MeasurementDataManager::MeasurementDataManager()
, m_networkManager(new QNetworkAccessManager(this)) , m_networkManager(new QNetworkAccessManager(this))
, m_webSocketClient(new WebSocketClient(this)) , m_webSocketClient(new WebSocketClient(this))
{ {
//static CGarbo garbo;
initialize(); initialize();
connect(m_webSocketClient, &WebSocketClient::dataReceived, this, &MeasurementDataManager::onReceiveRealtimeData); connect(m_webSocketClient, &WebSocketClient::dataReceived, this, &MeasurementDataManager::onReceiveRealtimeData);
} }
MeasurementDataManager::~MeasurementDataManager() MeasurementDataManager::~MeasurementDataManager()
{} {
}
void MeasurementDataManager::initialize() void MeasurementDataManager::initialize()
{ {
@ -59,6 +76,7 @@ void MeasurementDataManager::initialize()
//开启缓存数据的定期清理 //开启缓存数据的定期清理
m_dataCleanupInterval = 10 * 1000; m_dataCleanupInterval = 10 * 1000;
m_dataCleanupTimer.setInterval(m_dataCleanupInterval); m_dataCleanupTimer.setInterval(m_dataCleanupInterval);
m_dataCleanupTimer.start();
connect(&m_dataCleanupTimer, &QTimer::timeout, this, &MeasurementDataManager::cleanUpDataCache); connect(&m_dataCleanupTimer, &QTimer::timeout, this, &MeasurementDataManager::cleanUpDataCache);
} }

View File

@ -67,15 +67,15 @@ WebSocketClient::WebSocketClient(QObject* parent)
, m_webSocket(nullptr) , m_webSocket(nullptr)
, m_connected(false) , m_connected(false)
, m_connectionStatus(ConnectionStatus::Disconnected) , m_connectionStatus(ConnectionStatus::Disconnected)
, m_reconnectTimer(new QTimer(this)) //, m_reconnectTimer(new QTimer(this))
, m_reconnectInterval(5000) //默认5秒重连 , m_reconnectInterval(5000) //默认5秒重连
, m_reconnectAttempts(0) , m_reconnectAttempts(0)
, m_maxReconnectAttempts(10) //默认最多重连10次 , m_maxReconnectAttempts(10) //默认最多重连10次
{ {
setupWebSocket(); setupWebSocket();
m_reconnectTimer->setSingleShot(true); m_reconnectTimer.setSingleShot(true);
connect(m_reconnectTimer, &QTimer::timeout, this, &WebSocketClient::onReconnectTimeout); connect(&m_reconnectTimer, &QTimer::timeout, this, &WebSocketClient::onReconnectTimeout);
} }
WebSocketClient::~WebSocketClient() WebSocketClient::~WebSocketClient()
@ -166,7 +166,8 @@ void WebSocketClient::scheduleReconnect()
// 限制最大延迟为5分钟 // 限制最大延迟为5分钟
delay = qMin(delay, 300000);*/ delay = qMin(delay, 300000);*/
m_reconnectTimer->start(delay); // m_reconnectTimer->start(delay);
m_reconnectTimer.start(delay);
m_reconnectAttempts++; m_reconnectAttempts++;
m_connectionStatus = ConnectionStatus::Reconncting; m_connectionStatus = ConnectionStatus::Reconncting;
} }
@ -174,8 +175,10 @@ void WebSocketClient::scheduleReconnect()
void WebSocketClient::resetReconnect() void WebSocketClient::resetReconnect()
{ {
if(m_reconnectTimer->isActive()) // if(m_reconnectTimer->isActive())
m_reconnectTimer->stop(); // m_reconnectTimer->stop();
if(m_reconnectTimer.isActive())
m_reconnectTimer.stop();
m_reconnectAttempts = 0; m_reconnectAttempts = 0;
} }