Как смоделировать шину сообщений в Qt? - PullRequest
5 голосов
/ 30 октября 2010

Мне нужно реализовать простую шину сообщений:

  • Только один процесс, поэтому не нужно делать D-Bus.
  • Публикация / подписка на типизированные события (возможно, даже QObjects)

Я думал о том, чтобы использовать QSignalMapper для пометки «именованных событий», затем переизлучать из слота или подключать сигнал издателя к сигналу подписчика ...

Любые предложениямысли?Или я должен пойти по относительно простому шаблону проектирования?

PS: AFAICS для D-Bus на окнах вам нужно установить "стороннее" программное обеспечение, чтобы запустить его с Qt.

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

Почему бы вам просто не использовать один выделенный подкласс QObject в качестве шины сообщений?Там вы определяете все сигналы, которыми можно обмениваться через шину сообщений, и предоставляете соответствующие методы уведомления, которые излучают эти сигналы.Теперь каждый компонент, который хочет получать «сообщения», может подключаться к интересующим сигналам.

Если вам нужен более общий метод, используйте тот же подход, что и раньше.Однако подкласс (singleton) QObject теперь имеет только сигнал «message (QByteArray)» и открытый метод «sendMessage (QByteArray)», который испускает этот сигнал.Возможно, вы захотите также объявить метод отправки сообщения как слот, на случай, если вы захотите подключить другой сигнал к методу отправки.

Я сам использую эти подходы, и они прекрасно работают.Даже разные потоки могут общаться друг с другом с помощью этого механизма без каких-либо проблем.Если вы используете подход QByteArray, вы получите нечто похожее на DBus.Вы сериализуете и десериализуете свои сообщения и автоматически убедитесь, что все получатели сообщений получают свою собственную копию сообщений со всеми преимуществами, которые вы получаете, если выполняете параллельные вычисления.

0 голосов
/ 03 августа 2013

Вы можете попробовать это.Это именно то, что вы хотите.Это легкий и простой в использовании.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;
}
...