fix:修复MeasurementDataManager析构时出现的'QObject::startTimer: Timers can only be used with threads started with QThread‘错误
This commit is contained in:
parent
dad06a43d9
commit
e81a701414
|
|
@ -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();
|
||||||
//调整所在轴的范围
|
//调整所在轴的范围
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue