QObject: Cannot create children for a parent that is in a different thread.

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()。
QObject: Cannot create children for a parent that is in a different thread._第1张图片
找到的原因是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);
}

然后自己得出的结论就是,线程不调用线程,而是通知线程。

你可能感兴趣的:(QT,qt)