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)
continue;
static double marginFactor = 1.0;
//qDebug() << it.key() << ": " << data.value;
static double marginFactor = 0.0;
double dData = data.value;
Bars bar = it.value();
//调整所在轴的范围

View File

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

View File

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

View File

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

View File

@ -14,10 +14,25 @@
#include <QJsonParseError>
#include <QCoreApplication>
MeasurementDataManager* MeasurementDataManager::m_instance = nullptr;
MeasurementDataManager* MeasurementDataManager::instance()
{
static MeasurementDataManager instance;
return &instance;
// static MeasurementDataManager 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()
@ -25,12 +40,14 @@ MeasurementDataManager::MeasurementDataManager()
, m_networkManager(new QNetworkAccessManager(this))
, m_webSocketClient(new WebSocketClient(this))
{
//static CGarbo garbo;
initialize();
connect(m_webSocketClient, &WebSocketClient::dataReceived, this, &MeasurementDataManager::onReceiveRealtimeData);
}
MeasurementDataManager::~MeasurementDataManager()
{}
{
}
void MeasurementDataManager::initialize()
{
@ -59,6 +76,7 @@ void MeasurementDataManager::initialize()
//开启缓存数据的定期清理
m_dataCleanupInterval = 10 * 1000;
m_dataCleanupTimer.setInterval(m_dataCleanupInterval);
m_dataCleanupTimer.start();
connect(&m_dataCleanupTimer, &QTimer::timeout, this, &MeasurementDataManager::cleanUpDataCache);
}

View File

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