2016-07-06 160 views
5

我有一个线程服务器。连接启动后将QTcpSocket移动到一个新线程

与QTcpSocket需要被它需要跑线,FI创建于:通过传递套接字描述符Qt - Handle QTcpSocket in a new thread

我的问题是,我需要有线程池和移动插座上的一个特定的线程后,客户端已派出其上线的插座必须定义一个特定的标记。

换句话说,我需要读取插槽知道哪个线程事先放置。

一些想法是先绑定到与QTcpSocket,读,然后发送描述符线程并创建另一个与QTcpSocket但医生说:

注:这是不可能的初始化两个抽象插座与 相同的本地套接字描述符。

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

或许能够在子线程调用上之前setSocketDescriptor阅读在主线程中的socket描述符,如果这甚至有可能?

+1

出于好奇,为什么你必须使客户端告诉你,你必须在运行'QTcpSocket'哪个线程? – Mike

+0

*定义在哪个线程上套接字需要的特定标记* - 我想知道如何指定套接字需要的线程。 AFAIK在创建线程时不能指定线程ID。如果你想指定线程名称,你可以调用thread-> setObjectName(“Name”),这与套接字无关。 – rightaway717

+0

你为什么不简单地做socket-> moveToThread(otherthread)? –

回答

0

您完全可以轻松地移动插座跨越QThreads,只是要注意四两件事:

1)确保您与QTcpSocket没有父母,你移动

2)之前的举动之前,断开一切从套接字对象

3)连接任何你需要回到其在目标线程运行的功能(你可以使用某种池的线程有线程之前存储那些“移动”的对象去接他们

4)初始化后调用readAll(),因为你可能会遗漏一些readyRead()信号

看不到任何理由不这样做,如果这符合设计,至少我多次使用它多线程服务来分割套接字处理器核心。

+1

在写入数据时,您将收到'QIODevice'的警告。因为不是'QTcpSocket'的所有字段都可以在线程之间移动。 –

+0

最近几年所有工作都很好,因为我在许多项目中使用了这种技术。你能指定你的意思是什么样的警告吗? – evilruff

+1

我会尝试查找更多,因为我无法访问代码库。但有下一个警告:“QSocketNotifier:套接字通知器不能从另一个线程启用” –