QtRemoteObjects реплики, вызываемые для каждого сигнала реплики

Я построил минимальный source/replica прямая связь QtRo система: https://codeshare.io/29xj4V
То, что я хотел бы достичь, это однозначно определить сообщение, поступающее от source быть ответом на письмо от каждого из replicas, Если rep1 отправляет "привет источник, я rep1", я хотел бы source ответить назад "привет rep1 это источник". Я хотел бы добиться того же с 3 replicas работает с очень высокой и другой скоростью. Вопрос на каждом signal к source source ответы обратно на все 3 replicas; способ, которым я фильтрую это, посылая "id" из replica в текстовом формате, а затем добавить этот идентификатор обратно с сообщением, чтобы проверить его внутри replica само по себе, если это совпадение, оно принимает сообщение, в противном случае оно отбрасывает его. Хотя это, кажется, работает, здесь есть большие накладные расходы. Мой вопрос будет: есть ли лучший способ справиться с этим вместо отправки идентификатора туда и обратно? Спасибо

1 ответ

Решение

Реплики получают одинаковые сигналы, нет способа отфильтровать эти данные со стороны источника. Таким образом, фильтрация должна выполняться на стороне клиента, для этого вы можете использовать атрибут, который является идентификатором, и отправлять эти данные в качестве нового параметра в сигнале, а не отправлять их в сообщении. Так что, хотя звонков много, стоимость будет минимальной, так как if Заявление не занимает много времени.

remoteminimal.rep

class RemoteMinimal
{
    SIGNAL(sendData(const QString &, const QString &));
    SLOT(void printData(const QString &));
    SLOT(void process(const QString &, const QString &));
    SLOT(void triggerSendData());
};

minimalsource.h

#ifndef MINIMALSOURCE_H
#define MINIMALSOURCE_H

#include "rep_remoteminimal_source.h"
#include <QObject>

class MinimalSource : public RemoteMinimalSource
{
    Q_OBJECT
public:
    MinimalSource(QObject *parent = nullptr);
    ~MinimalSource() override;

public slots:
    void printData(const QString& data) override;
    void process(const QString& data, const QString & id) override;
    void triggerSendData() override;

private:
    int m_global_server;
};

#endif // MINIMALSOURCE_H

minimalsource.cpp

#include "minimalsource.h"

MinimalSource::MinimalSource(QObject* parent):
    RemoteMinimalSource (parent), m_global_server(0)
{
}

MinimalSource::~MinimalSource(){}

void MinimalSource::printData(const QString& data)
{
    Q_UNUSED(data);
}

void MinimalSource::process(const QString& data, const QString &id)
{
    m_global_server++;
    emit sendData(data+":"+QString::number(m_global_server), id);
}

void MinimalSource::triggerSendData()
{

}

objects.h

#ifndef OBJECTS_H
#define OBJECTS_H

#include <QObject>
#include "rep_remoteminimal_replica.h"

class QTimer;

class Objects: public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString id READ id WRITE setId)
    Q_PROPERTY(double rate READ rate WRITE setRate)
public:
    explicit Objects(QSharedPointer<RemoteMinimalReplica> ptr);
    ~Objects();
    double rate() const;
    void setRate(double rate);

    QString id() const;
    void setId(const QString &id);

signals:
    void sendData(const QString&, const QString &);

public slots:
    void printData(const QString&, const QString &);
    void process(const QString&);
    void triggerSendData();
    void run();
private:
    int m_global_server;
    QTimer *m_loop;
    double m_rate;
    QString m_id;
    QSharedPointer<RemoteMinimalReplica> reptr;
};

#endif // OBJECTS_H

objects.cpp

#include "objects.h"

#include <QTimer>
#include <QDebug>

Objects::Objects(QSharedPointer<RemoteMinimalReplica> ptr): QObject (Q_NULLPTR),
    m_global_server(0), reptr(ptr)
{
    m_loop = new QTimer(this);
}
Objects::~Objects(){}

void Objects::printData(const QString& data, const QString& id)
{
    if(id == m_id)
        qDebug() << "[" << m_id << "]:" << data;
}

void Objects::process(const QString& data)
{
    emit sendData(data+":processed", m_id);
}

void Objects::run()
{
    connect(m_loop, &QTimer::timeout, this, &Objects::triggerSendData);
    m_loop->setInterval(static_cast<int>(1000/m_rate));
    m_loop->start();
}

QString Objects::id() const
{
    return m_id;
}

void Objects::setId(const QString &id)
{
    m_id = id;
}

double Objects::rate() const
{
    return m_rate;
}

void Objects::setRate(double rate)
{
    m_rate = rate;
}

void Objects::triggerSendData()
{
    m_global_server++;
    emit sendData(QString("test:%1:%2").arg(m_id).arg(m_global_server), m_id);
}

Полный пример вы найдете здесь

Другие вопросы по тегам