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