Qt信号槽与线程

Qt signal slot with threads

本文关键字:线程 信号 Qt      更新时间:2023-10-16

我在QThread类中有信号/插槽的问题。我的设计是这样的:

class Manager : public QObject {
    Q_OBJECT
public:
    Manager(QObject* parent) : QObject(parent) {
        Thread thread* = new Thread(this);
        connect(this, SIGNAL(testsignal()), thread, SLOT(test()));
        thread->start();
        ...
        emit testsignal();
    }
signals:
    void testsignal();
};
class Thread : public QThread {
    Q_OBJECT
public slots:
    void test() {
        qDebug() << "TEST";
    }
private:
    void run() {}
};

信号从未到达我的test()方法。有人能帮忙吗?谢谢。

问题是跨线程发送信号会导致将信号排队到目标线程的事件队列(排队连接)中。如果该线程从不处理事件,它将永远不会得到信号。

同时,根据QThread::run文档:

从该方法返回将终止线程的执行。

换句话说,拥有一个空的run方法会导致线程立即终止,因此您正在向死线程发送信号。

发送给QThread对象的信号将转到父对象的线程。在本例中,指向创建它的线程。

要让一个对象驻留在另一个线程中,你应该把它移动到那个线程中:

class Manager : public QObject {
    Q_OBJECT
public:
    Manager(QObject* parent) : QObject(parent) {
        Thread thread* = new QThread(this);
        Receiver* rec = new Receiver(); //no parent
        connect(this, SIGNAL(testsignal()), rec, SLOT(test()));
        connect(thread, SIGNAL(finished()), rec, SLOT(deleteLater()));
        rec->moveToThread(thread);
        thread->start();
        ...
        emit testsignal();
    }
signals:
    void testsignal();
};
class Receiver: public QObject {
    Q_OBJECT
public slots:
    void test() {
        qDebug() << "TEST";
    }
};