QtRemoteObjects реплики, вызываемые для каждого сигнала реплики - PullRequest
0 голосов
/ 14 февраля 2019

Я построил минимальное source / replica прямое соединение QtRo система: https://codeshare.io/29xj4V
Я хотел бы однозначно идентифицировать сообщение, поступающее от source, чтобы оно былоответить на тот, который отправлен от каждого из replicas.Если rep1 отправит «hello source, I'm rep1», я бы хотел, чтобы source ответил «hello rep1 this is source».Я хотел бы добиться того же с 3 replicas, работающим с очень высокой и другой скоростью.Проблема возникает на каждом signal на source, который source отвечает на все 3 replicas;я фильтрую это, отправляя «id» replica в текстовом формате, а затем добавляю этот идентификатор обратно с сообщением, чтобы проверить его внутри самого replica, если это совпадение, то он принимает сообщениеиначе это отбрасывает.Хотя это, кажется, работает, здесь есть большие накладные расходы.Мой вопрос будет: есть ли лучший способ справиться с этим вместо отправки идентификатора туда и обратно?спасибо

1 Ответ

0 голосов
/ 14 февраля 2019

Реплики получают одинаковые сигналы, нет способа отфильтровать эти данные со стороны источника.Таким образом, фильтрация должна выполняться на стороне клиента, для этого вы можете использовать атрибут, который является идентификатором, и отправлять эти данные в качестве нового параметра в сигнале, а не отправлять их в сообщении.Поэтому, несмотря на большое количество вызовов, стоимость будет минимальной, поскольку оператор 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);
}

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

...