带线程的Qt信号插槽
我在QThread类中的信号/插槽存在问题。我的设计如下所示:带线程的Qt信号插槽
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()方法。有人可以帮忙吗?谢谢。
问题是sending signals across threads导致排队信号到目标线程的事件队列(排队连接)。如果该线程从不处理事件,它将永远不会得到信号。
此外,according to the QThread::run
documentation:
从该方法返回将结束线程的执行。
换句话说,有一个空的run
方法会导致线程的即时终止,所以你发送一个信号到一个死的线程。
好的。我为我的run方法添加了一个infinte循环:'while(true){}'并且没有任何变化。我从来没有收到信号。 – adapto
@adapto因为您需要启动* event *循环,所以最简单的方法就是调用'this-> exec()'(或者不要重新实现运行)。 –
发送到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";
}
};
谢谢。我试过这个,但没有奏效。我添加了'connect(thread,SIGNAL(started()),mFetchTilesThread,SLOT(run()));'并将'run()'方法放到'public slot'中。这个方法被正确调用。 – adapto
'主题::测试()'不被定义为一个槽。 – owacoder
对不起。这是一个错字。 – adapto
'线程线程*'另一个错字?你的代码现在适用于我。 – SingerOfTheFall