QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x73e6e0), parent’s thread is Thread(0x2ab15d8), current thread is QThread(0x731448)
使用环境:使用TCP服务,当有客户端连接过来的时候,就会开启一个单独的线程处理客户端的业务处理。
因为有多个客户端,为了获取到数据的时候区分是哪一个客户端请求的,所以发生请求的时候加上了线程的对象本身。
这里客户端发送的是TCP服务的信号![在这里插入图片描述](https://img-blog.csdnimg.cn/9dfd23096e5846428bef0dc5a2f2a01f.png)
等数据请求完的时候函数直接调用线程对象的数据处理。
void tcpclientThread::readReady()
{
qDebug()<<__FUNCTION__<<"Thread:"<<this->thread();
if(server != nullptr)
{
qDebug()<<"Thread TCPServer:"<<server;
TcpServer* tcpserver = (TcpServer*)server;
emit tcpserver->sigEcisRequest(cmdObj, this);
}
}
void Administration::slotdata(QJsonObject jsonObj, void *requester)
{
if(requester)
{
Thread *tcpclient = (Thread*)requester;
qDebug()<<__FUNCTION__<<this->thread();
tcpclient ->Processing(jsonObj);
}
}
然后就出现这句话:QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x73e6e0), parent’s thread is Thread(0x2ab15d8), current thread is QThread(0x731448)
这句话的意思是:
后来通过打印日志,从TCP服务启动到客户端业务处理的里面函数都加上打印线程 this->thread()。
找到的原因是tcpclient ->dealEcisReceive(jsonObj);直接调用客户端的数据处理函数,因为线程对象里面的调用了tcpClient->write(ba); ,tcpClient对象是有client线程创建的。 把这句注释掉就没有报错了。因为错误提示是当前线程是tcp服务的那个线程,所以我想是不是我通过线程对象直接调用处理函数,然后还是tcp服务线程进去处理呢?
void tcpclientThread::sendTcpPacket(const QByteArray &ba)
{
qDebug()<<__FUNCTION__<<"Thread:"<<this->thread();
if(tcpClient->state()==QAbstractSocket::ConnectedState)
{
tcpClient->write(ba);
}
}
后来我就换了一种方式,不直接调用线程对象的处理方法,而是调用tcp服务的函数发信号通知client线程。
然后问题就解决了。
void Administration::slotdata(QJsonObject jsonObj, void *requester)
{
if(requester)
{
tcpServer->dealEcisPush(jsonObj,requester);
}
}
void TcpServer::dealEcisPush(QJsonObject dataObj,void * requester)
{
emit sigEcisPush(dataObj,requester);
}
然后自己得出的结论就是,线程不调用线程,而是通知线程。