簡體   English   中英

帶線程的 Qt 信號槽

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM