无法写入QRunnable内的QTcpSocket

时间:2018-01-18 21:34:34

标签: qt qthread qtconcurrent

我在spark.sql.autoBroadcastJoinThreshold中构建了一个服务器,它接受连接到它的每个客户端,并将连接发送到工作线程(我用Qt实现它,并将线程连接到QRunnable )。

在我的线程中,我从套接字(QThreadPool)读取没有问题,但是当我尝试写入它时,我收到以下错误:

  

QObject:无法为不同的父级创建子级   线。父线程是QThread(0x28602f90860)

我尝试通过添加代码行来修复此问题:

QTcpSocket socket

在我的线程的构造函数中 - 但它没有帮助,我得到以下错误:

  

QObject:无法为处于不同线程的父级创建子级   (Parent是QNativeSocketEngine(0x1dab6331c60),父母的主题   是QThread(0x1dab62eacf0),当前线程是QThread(0x1dab632b140)
  QSocketNotifier:无法启用或禁用套接字通知程序   另一个线程

有谁知道这个问题是什么或者如何解决它?

相关代码段的稀疏示例:

socket->setParent(this);

1 个答案:

答案 0 :(得分:0)

如果您查看QTcpServer文档,其中一条说明如下:

  

注意:如果要将传入连接作为另一个线程中的新QTcpSocket对象处理,则必须将socketDescriptor传递给另一个线程并创建{ {1}}对象并使用其QTcpSocket方法。

要做到这一点,还有关于setSocketDescriptor()的说明:

  

注意:无法从其他线程使用返回的incomingConnection()对象。如果您想使用其他线程的传入连接,则需要覆盖 QTcpSocket

所以子类incomingConnection()类并实现一个QTcpServer,它获取套接字描述符并发送给线程。

此处为exampleincomingConnection()。{/ p>