我有一个继承自QThread
并且在while循环中处理ZeroMQ SUB
订阅套接字的类(在线程的run方法中进行轮询)并通知GUI线程通过从套接字接收消息时发出信号。
在这个QThread
派生类中,在轮询循环之前,我还创建了一个ZeroMQ PUB
发布套接字,并且有一些方法可以使用它。这些方法仅在主线程(GUI)中用于将数据发送到服务器。
这个解决方案没有任何问题,但它并不完美。我只想要一个线程来处理订阅和发布套接字操作。 GUI线程(主)而不是调用QThread
派生类方法,将发送信号以请求发布数据。
基于Qt工具,是否有一个很好的模式来实现它?
答案 0 :(得分:1)
基于Qt工具,是否有一个很好的模式来实现它?
好吧,
PUB
和 SUB
独立于主要动机,ZeroMQ引擎不是问题所在。如果查看电线和细节内部,ZeroMQ Context()
实例实际上是线程池,它为性能调优和各自的优先级提供了大量机会,将套接字实例映射到直接映射的组ZeroMQ I / O线程。
如果不能每天使用ZeroMQ,可以在5秒内阅读主要的概念差异,如[ZeroMQ hierarchy in less than a five seconds]部分简要概述。
这就是说,主要关注的是人们如何要求Qt生态系统来说话#34;通过ZeroMQ基础设施。鉴于纯粹的非阻塞,精心设计的代码被放入管道中,让ZeroMQ在整个平台上发送和收集信号不会有任何重大障碍。
消息传递的效率,(超) - 低延迟和零复制机制非常方便,触手可及。这意味着,糟糕的想法或令人讨厌的代码将仍然是坏的或令人讨厌的,ZeroMQ框架不能归咎于"制造麻烦"的 :o)
强>
答案 1 :(得分:0)
在QObject中,我可以使用QTimer来处理订阅套接字的轮询和一些信号/槽来处理发布套接字,还可以以线程安全的方式配置订阅套接字。 QTimer并不是必需的,我可以在每次迭代调用时使用无限循环:
QThread::currentThread()->eventDispatcher()->processEvents(QEventLoop::WaitForMoreEvents);
处理收到的信号。