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

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

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

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

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

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

【问题讨论】:

    标签: qt dbus publish-subscribe


    【解决方案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>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 2010-12-10
      • 2020-03-29
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      相关资源
      最近更新 更多