5

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

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

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

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

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

4

2 回答 2

3

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

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

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

于 2011-08-05T22:21:06.593 回答
1

你可以试试这个。这正是你想要的。它重量轻且易于使用。 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;
}
于 2013-08-03T16:40:11.327 回答