我在spark.sql.autoBroadcastJoinThreshold
中构建了一个服务器,它接受连接到它的每个客户端,并将连接发送到工作线程(我用Qt
实现它,并将线程连接到QRunnable
)。
在我的线程中,我从套接字(QThreadPool
)读取没有问题,但是当我尝试写入它时,我收到以下错误:
QObject:无法为不同的父级创建子级 线。父线程是QThread(0x28602f90860)
我尝试通过添加代码行来修复此问题:
QTcpSocket socket
在我的线程的构造函数中 - 但它没有帮助,我得到以下错误:
QObject:无法为处于不同线程的父级创建子级 (Parent是QNativeSocketEngine(0x1dab6331c60),父母的主题 是QThread(0x1dab62eacf0),当前线程是QThread(0x1dab632b140)
QSocketNotifier:无法启用或禁用套接字通知程序 另一个线程
有谁知道这个问题是什么或者如何解决它?
相关代码段的稀疏示例:
socket->setParent(this);
答案 0 :(得分:0)
如果您查看QTcpServer
文档,其中一条说明如下:
注意:如果要将传入连接作为另一个线程中的新
QTcpSocket
对象处理,则必须将socketDescriptor
传递给另一个线程并创建{ {1}}对象并使用其QTcpSocket
方法。
要做到这一点,还有关于setSocketDescriptor()
的说明:
注意:无法从其他线程使用返回的
incomingConnection()
对象。如果您想使用其他线程的传入连接,则需要覆盖QTcpSocket
。
所以子类incomingConnection()
类并实现一个QTcpServer
,它获取套接字描述符并发送给线程。
此处为example个incomingConnection()
。{/ p>