【问题标题】:Communication with a permanent thread handling ZeroMQ with Qt与使用 Qt 处理 ZeroMQ 的永久线程进行通信
【发布时间】:2018-06-13 15:36:36
【问题描述】:

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

在这个QThread派生类中,在轮询循环之前,我还创建了一个ZeroMQ PUB发布套接字,并且有使用它的方法。这些方法只在主线程(GUI)中用于向服务器发送数据。

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

有没有基于 Qt 工具的不错的模式来实现它?

【问题讨论】:

    标签: c++ qt zeromq


    【解决方案1】:

    有没有基于 Qt 工具的不错的模式来实现它?

    嗯,

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

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

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

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

    消息传递的效率、(超)低延迟和零拷贝机制非常方便,触手可及。这意味着,那个坏主意或讨厌的代码将仍然是坏的或讨厌的,ZeroMQ 框架不能被指责为“制造麻烦”:o)

    【讨论】:

      【解决方案2】:

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

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

      处理接收到的信号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多