使用Qt的多线程时,出现 QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread 的错误。通过查询资料总结如下:
根据以上的结论,代码报错的原因是:
原来的代码:
#pragma once
#ifndef DataReceive_h__
#define DataReceive_h__
#include
#include
#include "common.h"
class QUdpSocket;
class DataReceive : public QObject
{
Q_OBJECT
public:
DataReceive(QObject *parent=nullptr);
~DataReceive();
public slots:
void slotReadyRead();
void doInit();
signals:
void sigCoilData(Coils_T coils);
void sigSensorData(Sensors_T sensors);
private:
QByteArray _recv();
private:
QUdpSocket* m_pUdp = nullptr;
QByteArray _cache;
QByteArray _packet;
Coils_T _cache_coils;
Sensors_T _cache_sensors;
std::vector _coils_mask{ 0,1,2,3,4,5,6,7,8,9 };
std::vector _sensors_mask{ 0,1,2,3,4,5,6,7,8,9 };
};
#endif // DataReceive_h__
DataReceive::DataReceive(QObject *parent)
: QObject(parent)
{
m_pUdp = new QUdpSocket;
m_pUdp->bind(QHostAddress::LocalHost, 244);
//接收数据
bool isR = connect(m_pUdp, &QUdpSocket::readyRead, this, &DataReceive::slotReadyRead);
}
更改后:
void DataReceive::doInit() {
m_pUdp = new QUdpSocket;
m_pUdp->bind(QHostAddress::LocalHost, 244);
//接收数据
bool isR = connect(m_pUdp, &QUdpSocket::readyRead, this, &DataReceive::slotReadyRead);
}
将DataReceive构造函数中初始化upd的代码放到了doInit中,该函数被
QThread* t = new QThread;
m_dataReceive->moveToThread(t);
bool isB = connect(t, SIGNAL(started()), m_dataReceive, SLOT(doInit()));
started信号调用。