Как имитировать шину сообщений в Qt?

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

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

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

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

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


person Derick Schoonbee    schedule 30.10.2010    source источник


Ответы (2)


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

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

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

person Jonny Dee    schedule 05.08.2011

Вы можете попробовать это. Это именно то, что вы хотите. Он легкий и простой в использовании. 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;
}
person Eric    schedule 03.08.2013
comment
Заявление об отказе от ответственности за то, что вы являетесь автором этой ссылки, может быть не так уж плохо. Кроме того, некоторый пример кода (и описание того, почему он лучше, чем другие вещи) поможет, поскольку ответы только на ссылки - это не то, что здесь искали. - person Macke; 14.01.2014