如何在 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 中模拟消息总线?的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure 数据工厂中完成活动后,如何向 Azure 服务总线发送消息