Проблема подключения слота Qt - PullRequest
0 голосов
/ 08 февраля 2019

Попытка создать 2 объекта (клиента), живущих в разных потоках и взаимодействующих с 1 объектом (сервером), живущим в основном потоке.Однако я не вижу никакой активности на объекте сервера.Основная цель этого кода - увидеть, как будет вести себя слот сигналов, когда 2 сигнала, поступающие из 2 разных потоков, обмениваются данными с одним объектом в главном потоке.

objects.cpp:

    #include "objects.h"

    Objects::Objects(QObject* parent): QObject (parent)
    {
    }

    void Objects::printData(const QString& data)
    {
        qDebug() << data;
    }

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

    Q_NORETURN void Objects::run()
    {
        while (true) {
            //qDebug() << "hit" << m_rate;
            emit sendData("test"+QString::number(m_rate));
            QThread::sleep(m_rate);
        }
    }

objects.h:

    #ifndef OBJECTS_H
    #define OBJECTS_H
    #include <QObject>
    #include <QDebug>
    #include <QThread>

    class Objects: public QObject
    {
        Q_OBJECT
    public:
        explicit Objects(QObject* parent = Q_NULLPTR);

    signals:
        void sendData(const QString&);

    public slots:
        void printData(const QString&);
        void process(const QString&);
        void run();

    public:
        ulong m_rate;

    };

    #endif // OBJECTS_H

main.cpp:

#include <QCoreApplication>
#include "objects.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Objects ser;
    Objects cl1;
    Objects cl2;
    cl1.m_rate = 1;
    cl2.m_rate = 2;

    QThread cl1_t;
    QThread cl2_t;

    QObject::connect(&cl1_t, &QThread::started, &cl1, &Objects::run);
    QObject::connect(&cl2_t, &QThread::started, &cl2, &Objects::run);


    QObject::connect(&cl1, &Objects::sendData, &ser, &Objects::process);
    QObject::connect(&cl2, &Objects::sendData, &ser, &Objects::process);

    QObject::connect(&ser, &Objects::sendData, &cl1, &Objects::printData);
    QObject::connect(&ser, &Objects::sendData, &cl2, &Objects::printData);

    cl1.moveToThread(&cl1_t);
    cl2.moveToThread(&cl2_t);

    cl1_t.start();
    cl2_t.start();

    return a.exec();
}

1 Ответ

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

Похоже, ваши void run() блоки-члены-функции Qt внутренняя очередь событий.Просто добавьте QCoreApplication::processEvents(); в вашу void run(), и она решит вашу проблему.

void Objects::run()
{
    while (true) {
        qDebug() << "hit" << m_rate;
        emit sendData("test" + QString::number(m_rate));
        QThread::sleep(m_rate);
        QCoreApplication::processEvents();
    }
}

UPD: Я предлагаю вам прочитать ЭТУ вики-статьюдля более подробного объяснения вашей проблемы.

...