在 qt 中创建另一个网络线程

Posted

技术标签:

【中文标题】在 qt 中创建另一个网络线程【英文标题】:Creating another network thread in qt 【发布时间】:2013-12-05 07:17:25 【问题描述】:

我是 qt 新手,正在尝试创建一个 qt 应用程序。截至目前,该应用程序有 1 个运行 libevent 事件循环的线程。我想创建另一个线程(这将是一个负责 ssl 请求的永久网络 qt 线程)。

我创建了子类 QOBject 的 WorkerObject。此外,我有一个 MyThread 子类 QThread,它在 run 方法中运行事件循环。我在 main 中创建这个线程并在应用程序结束时将其终止。

我想在 WorkerObject 中进行的所有网络操作(包括发布请求)。我如何以及在哪里适当地创建 WorkerObject,以便在 MyThread 的事件循环中处理它的所有信号和信号。因为例如,每当用户希望我发送它时,我都需要调用方法(发送 post/get 请求)。

提前感谢您的回答。

【问题讨论】:

一般来说,不要继承 Qthread,除非。这是一个反复出现的话题which has been answered 【参考方案1】:

在 QThread 中使用对象的条件是,一旦线程启动,它们只能通过信号和槽进行通信。因此,如果 workerobject 需要开始工作,则必须通过信号触发。

看看这个answer on a similar question,这是推荐的做法。

基本上,您将 Qthread 的启动信号连接到 workerobject starthandlingSSLrequest。然后启动你的线程,如果它不是多线程的,你会调用starthandlingSSLrequest 对象。

当用户想让你做某事时,你只需在主循环中触发信号,所有连接的插槽将在稍后执行。

【讨论】:

【参考方案2】:

除非您要创建一个要同时处理大量请求的服务器,否则我建议您不要在这种情况下使用线程。 Qt 的网络类是异步的,因此您可以很容易地在主线程上继续使用它们。看一下QSsLSocket,它来源于QTcpSocket。有如何使用 Ssl 创建服务器和客户端以及如何使用它们的示例。

【讨论】:

我的主线程中已经有一个事件循环(来自 libevent 库)。这就是为什么我希望在另一个线程中为我的帖子请求创建一个事件循环 Qt 是一个多平台开发环境,它通过 QCoreApplication 或 QApplication 提供事件循环。为什么要改用 libevent 库? 这是以前使用过的代码,我们不想扔掉它。 我建议你迁移到 Qt,但无论如何,为了更直接地回答你的问题,你应该在主线程中创建 workerObject,设置信号和插槽的连接,然后将其移动到带有 WorkerObject->moveToThead(MyThread) 的线程;然后使用信号和槽在主线程和新的 MyThread 之间进行通信。

以上是关于在 qt 中创建另一个网络线程的主要内容,如果未能解决你的问题,请参考以下文章

Qt5中创建临时的后台线程。

关于Qt在新线程中创建定时器的问题

Qt 多线程和网络编程学习

每次在 django 中创建另一行时创建一行

在python中创建另存为函数

是否可以在同一端口上的 HTTP 中创建另一个端点?