带螺纹的Qt信号槽

时间:2015-10-19 13:22:52

标签: c++ multithreading qt

我在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()方法。有人可以帮忙吗?感谢。

2 个答案:

答案 0 :(得分:2)

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

另外,according to the QThread::run documentation

  

从此方法返回将结束线程的执行。

换句话说,使用空run方法会导致线程立即终止,因此您需要向死线程发送信号。

答案 1 :(得分:0)

发送到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";
    }
};