在Qt中写多线程网络通信时碰到了个问题,具体情形如下:
新建一个FileRecvThread继承QThread,重写run函数
- C/C++ code
class FileRecvThread : public QThread{ Q_OBJECTpublic: 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的线程中
不知道是不是这个原因