如何在 Qt 中模拟消息总线?

Posted

技术标签:

【中文标题】如何在 Qt 中模拟消息总线?【英文标题】:How to simulate a message bus in Qt? 【发布时间】:2011-05-02 21:26:36 【问题描述】:

我需要实现一个简单的消息总线:

只有一个进程,因此不需要 D-Bus。 发布/订阅类型化事件(甚至可以是 QObjects)

我正在考虑使用 QSignalMapper 来标记“命名事件”,然后从插槽重新发射或将发布者信号连接到订阅者的信号......

有什么建议吗?还是应该选择相对简单的设计模式?

PS:Windows 上 D-Bus 的 AFAICS 需要安装“第 3 方”软件才能与 Qt 配合使用。

【问题讨论】:

【参考方案1】:

您为什么不只使用一个专用的 QObject 子类作为消息总线?在那里,您定义了可能通过消息总线交换的所有信号,并提供相应的通知方法来发出这些信号。现在每个想要接收“消息”的组件都可以连接到感兴趣的信号。

如果您想要更通用的方法,请使用与以前相同的方法。然而,(单例)QObject 子类现在只有一个“message(QByteArray)”信号和一个发出该信号的“sendMessage(QByteArray)”公共方法。您可能还想将发送消息方法声明为插槽,以防万一您想将另一个信号连接到发送方法。

我自己使用这些方法,它们工作得非常好。甚至不同的线程也可以使用这种机制相互通信而不会出现任何问题。如果你使用 QByteArray 方法,你会得到类似于 DBus 的东西。您对消息进行序列化和反序列化,并自动确保所有消息接收者都获得他们自己的消息副本,以及进行并行计算所获得的所有好处。

【讨论】:

【参考方案2】:

你可以试试这个。这正是你想要的。它重量轻且易于使用。 https://github.com/lheric/libgitlevtbus

#include "gitlmodual.h"
#include <QDebug>

int main(int argc, char *argv[])

    GitlModual cModual;

    /// subscribe to an event by name ("I am a test event")
    cModual.subscribeToEvtByName("I am a test event",
    [](GitlEvent& rcEvt)->bool                          ///< lambda function as a callback
    
        qDebug() << "Hello GitlEvtBus!";
        return true;
    
    );

    GitlEvent cEvent("I am a test event");              ///< create an event
    cEvent.dispatch();                                  ///< dispatch

    /// output: "Hello GitlEvtBus!"

    return 0;

【讨论】:

关于成为该链接作者的免责声明可能还不错。此外,一些示例代码(以及为什么它比其他东西更好的描述)会有所帮助,因为仅链接的答案不是这里要寻找的。​​span>

以上是关于如何在 Qt 中模拟消息总线?的主要内容,如果未能解决你的问题,请参考以下文章

Qt CAN编程1- CAN总线整体介绍

在 Azure 数据工厂中完成活动后,如何向 Azure 服务总线发送消息

如何查看 Azure 服务总线队列中的所有消息?

如何防止重复消息在 WebJob 处理时不插入到服务总线队列中?

基于RabbitMQ的消息总线架构设计

如何从 Windows 服务总线订阅中获取未处理的消息计数?