[英]Qt signal slot with threads
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";
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.