代码之家  ›  专栏  ›  技术社区  ›  bardao

为每个副本信号调用qtreoteobjects副本

  •  0
  • bardao  · 技术社区  · 7 年前

    我建立了一个最小的 source / replica 直接连接 QtRo 系统: https://codeshare.io/29xj4V
    我想要实现的是唯一地识别来自 来源 作为对每个 replicas . 如果 rep1 发送“你好消息源,我是rep1”,我想要 来源 回复“Hello rep1 This is source”。我想用3来达到同样的效果 复制品 以非常高和不同的速度运行。问题在于 signal 来源 这个 来源 回复全部3个 复制品 ;我过滤的方式是发送 复制品 在文本格式中,然后将该ID与消息一起追加,以在 复制品 本身,如果匹配,则接受消息,否则丢弃消息。虽然这看起来很有效,但这里的开销很大。我的问题是:有没有更好的方法来处理这个问题,而不是来回发送一个标识符?谢谢

    0 回复  |  直到 7 年前
        1
  •  1
  •   eyllanesc    7 年前

    副本接收相同的信号,无法从源端过滤该数据。因此,过滤必须在客户端完成,为此,可以使用标识符属性,并将该数据作为新参数发送到信号中,而不是在消息中发送。因此,尽管有很多电话,但成本将是最低的,因为 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());
    };
    

    最小源.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
    

    最小源.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()
    {
    
    }
    

    对象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
    

    对象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);
    }
    

    你找到的完整例子 here

    推荐文章