与使用 Qt 处理 ZeroMQ 的永久线程通信

Communication with a permanent thread handling ZeroMQ with Qt

我有一个 class 继承自 QThread 并在 while 循环中处理 ZeroMQ SUB 订阅套接字(轮询线程的 运行 方法)并在从套接字接收消息时通过发出信号通知 GUI 线程。

在这个QThread导出的class中,在轮询循环之前,我还创建了一个ZeroMQ PUB publish socket并且有方法使用它。这些方法仅在主线程(GUI)中用于向服务器发送数据。

这个解决方案没有任何问题,但并不完美。我只希望一个线程来处理订阅和发布套接字操作。 GUI 线程 ( main ) 不会调用 QThread 派生的 class 方法,而是发送一个信号来请求发布数据。

有没有基于 Qt 工具的很好的模式来实现它?

Is there a nice pattern, based on Qt tools, to implement that ?

嗯,

ZeroMQ部分同时处理PUBSUB没有问题

独立于主要动机,ZeroMQ 引擎不是这里的问题。如果查看内部线路和细节,ZeroMQ Context() 实例实际上是线程池,它为性能调整和各自的优先级提供了很多机会,将套接字实例直接映射到-ZeroMQ 的映射组 I/O-threads.

如果不是每天使用 ZeroMQ,可以花 5 秒时间阅读主要概念差异,如 [] 部分中简要概述的那样。

这就是说,主要关注的是如何通过 ZeroMQ 基础设施要求 Qt 生态系统 "speak"。如果将纯非阻塞、设计良好的代码放入管道中,那么让 ZeroMQ 在平台上发送和收集信号就不会有重大障碍。

消息传递的效率、(超)低延迟和零复制机制非常方便,触手可及。这意味着,那个糟糕的想法或令人讨厌的代码将仍然是糟糕或令人讨厌的,ZeroMQ 框架不能归咎于 "making troubles" :o)

在 QObject 中,我可以使用 QTimer 来处理订阅套接字的轮询,使用一些 signal/slots 来处理发布套接字,但也可以线程安全的方式配置订阅套接字。 QTimer 并不是真正必要的,我可以有一个无限循环并且在每次迭代调用时:

QThread::currentThread()->eventDispatcher()->processEvents(QEventLoop::WaitForMoreEvents);

处理接收到的信号。