Qt在多线程中使用QTcpSocket碰见的有关问题
Qt在多线程中使用QTcpSocket碰见的问题
在Qt中写多线程网络通信时碰到了个问题,具体情形如下:
新建一个FileRecvThread继承QThread,重写run函数
原来写过java所以this用的比较多,大家见谅-。-!
把代码裁剪了下,一些不需要贴出来的都删掉了,具体问题如下:
在Qt creator下出现
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0xac00878), parent's thread is FileRecvThread(0xac131b8), current thread is QThread(0x3e54c8),
意思我明白,就是对象不在同一线程下新建和调用出现的问题,可是
QTcpSocket作为FileRecvThread的子对象存在,而且用qDebug打印了下
pTcpSocket->thread()和pTcpServer->thread()这是一致的,都是0x3e54c8,
this->pTcpSocket->write("deal");也是在FileRecvThread内,按道理说他是属于FileRecvThread线程的,何况先使用了this->pTcpSocket->readAll();
能读取数据,而this->pTcpSocket->write();却不行,这是什么原因,求解
。。。。。
谢谢大虾了~~~
------解决方案--------------------
connect后执行的槽函数并不是在你的run函数所处的线程中执行的
每次有信号其实都在主线程中执行,而你的QTcpSocket初始化是在run的线程中
不知道是不是这个原因
在Qt中写多线程网络通信时碰到了个问题,具体情形如下:
新建一个FileRecvThread继承QThread,重写run函数
- C/C++ code
class FileRecvThread : public QThread { Q_OBJECT public: explicit FileRecvThread(QObject *parent = 0); FileRecvThread(quint32, QObject *parent = 0); ~FileRecvThread(); void initSignalSlots(); void setPort(quint32 port); quint32 getPort(); void dealShackHand(QByteArray *); void replyExpectShackHand(); protected: void run(); private: quint32 port; QTcpServer *pTcpServer; QTcpSocket *pTcpSocket; public slots: void startTcpServer(); void dealNewConnection(); void dealDatagram(); FileRecvThread::FileRecvThread(quint32 port, QObject *parent) : QThread(parent) { this->port = port; } void FileRecvThread::startTcpServer() { if (!this->pTcpServer) { this->pTcpServer = new QTcpServer; this->pTcpServer->listen(QHostAddress::Any, this->port); } else { this->pTcpServer->listen(QHostAddress::Any, this->port); } } void FileRecvThread::run() { this->startTcpServer(); this->initSignalSlots(); this->exec(); } void FileRecvThread::initSignalSlots() { connect(this->pTcpServer, SIGNAL(newConnection()), this, SLOT(dealNewConnection())); } void FileRecvThread::dealNewConnection() { this->pTcpSocket = this->pTcpServer->nextPendingConnection(); connect(this->pTcpSocket, SIGNAL(readyRead()), this, SLOT(dealDatagram())); } void FileRecvThread::dealDatagram() { QByteArray byteArray = this->pTcpSocket->readAll(); //这里出现问题 [color=#FF0000]this->pTcpSocket->write(QByteArray("deal"));[/color] }
原来写过java所以this用的比较多,大家见谅-。-!
把代码裁剪了下,一些不需要贴出来的都删掉了,具体问题如下:
在Qt creator下出现
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0xac00878), parent's thread is FileRecvThread(0xac131b8), current thread is QThread(0x3e54c8),
意思我明白,就是对象不在同一线程下新建和调用出现的问题,可是
QTcpSocket作为FileRecvThread的子对象存在,而且用qDebug打印了下
pTcpSocket->thread()和pTcpServer->thread()这是一致的,都是0x3e54c8,
this->pTcpSocket->write("deal");也是在FileRecvThread内,按道理说他是属于FileRecvThread线程的,何况先使用了this->pTcpSocket->readAll();
能读取数据,而this->pTcpSocket->write();却不行,这是什么原因,求解
。。。。。
谢谢大虾了~~~
------解决方案--------------------
connect后执行的槽函数并不是在你的run函数所处的线程中执行的
每次有信号其实都在主线程中执行,而你的QTcpSocket初始化是在run的线程中
不知道是不是这个原因