Qt信号槽连接问题

时间:2019-02-07 21:55:15

标签: qt qthread qt-signals

尝试创建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 :(得分:1)

看起来像您的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: 我建议您阅读THIS Wiki文章,以详细了解您的问题。