在启动连接后将QTcpSocket移动到新线程

Dam*_*ien 6 qt qthread qtcpsocket

我有一个线程服务器.

需要在需要运行的线程上创建QTcpSocket,FI:Qt -通过传递套接字描述符在新线程中处理QTcpSocket.

我的问题是,我需要有一个线程池并在特定线程上移动套接字在客户端发送了一个特定的令牌后,该令牌定义了套接字需要的线程.

换句话说,我需要读取套接字以了解预先放置它的线程.

一些想法是首先绑定到QTcpSocket,读取,然后将描述符发送到线程并创建另一个QTcpSocket,但文档说:

注意:无法使用相同的本机套接字描述符初始化两个抽象套接字.

另一个解决方案是在一个单独的线程中创建套接字,然后将两个线程连接在一起,但我不知道是否可能.

或者也许能够在子线程上调用setSocketDescriptor之前读取主线程上的套接字描述符,如果可能的话?

evi*_*uff 2

您绝对可以轻松地在 QThread 之间移动套接字,只需注意四件事:

1) 在移动之前确保你的 QTcpSocket 没有父进程

2)在移动之前断开套接字对象的所有连接

3)将您需要的任何内容连接回在目标线程中运行的函数(您可以在线程中使用某种池,在线程拾取它们之前存储那些“移动”的对象)

4)在init之后调用readAll(),因为你可能会错过一些readyRead()信号

如果这符合设计,没有任何理由不这样做,至少我多次将它用于多线程服务来跨内核拆分套接字处理程序。

  • 没有必要做任何断开连接——那只是愚蠢的。其他点都是有效的。`QTcpSocket` 绝对可以在线程之间移动,至少在 OS X 和 Windows 上,我一直这样做,而且它确实有效。套接字可能有一个父级,然后您必须在切换线程之前取消它的父级(例如,通过将其父级设置为瞬态对象)。 (2认同)