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

时间:2010-10-30 19:07:30

标签: qt dbus publish-subscribe

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

  • 一个过程因此不需要做D-Bus。
  • 发布/订阅类型化事件(甚至可能是QObjects)

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

有任何建议吗?或者我应该采用相对简单的设计模式?

PS:在Windows上使用D-Bus的AFAICS,您需要安装“第三方”软件才能使用Qt。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

你可以试试这个。这正是你想要的。它重量轻,易于使用。 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;
}