QT踩坑記錄1-多線程信號與槽


QT踩坑記錄1-多線程信號與槽

錯誤輸出

無錯誤輸出, 但是聲明了信號的連接,但是無法使用 程序中就是無命令

介紹

QT 典型程序

#include <QObject>
class MyClass:public QObject
{
    Q_OBJECT
signals:
    void signals_dosomething(int n);

public slots:
    void slots_dosomething(int n) {
        m_value_ = n;
    }
private:
    int m_value_;
public:
    MyClass(QObjet *parent = nullptr)
        :QObject(parent),
         m_value_(0)
    {
        QObject::connect(this,
                        &MyClass::signals_dosomething,
                        this,
                        &MyClass::slots_dosomething,
                        Qt::DirectConnection);
        
    }    
}

解決

手動指定連接方式

connect(sender, signal, receiver, slot);
其實,connect還有一個Qt::ConnectionType參數,只是它帶有默認值,且多數情況下,默認值足夠了,所以最少有機會去了解。Qt::ConnectionType的可選值如下:

Qt::AutoConnection:
默認值,使用這個值則連接類型會在信號發送時決定。如果接收者和發送者在同一個線程,則自動使用Qt::DirectConnection類型。如果接收者和發送者不在一個線程,則自動使用Qt::QueuedConnection。

Qt::DirectConnection: 槽函數會在信號發送的時候直接被調用,槽函數運行於信號發送者所在線程。效果看上去就像是直接在信號發送位置調用了槽函數。這個在多線程環境下比較危險,可能會造成奔潰。

Qt::QueuedConnection: 槽函數在控制回到接收者所在線程的事件循環時被調用,槽函數運行於信號接收者所在線程。發送信號之后,槽函數不會立刻被調用,等到接收者的當前函數執行完,進入事件循環之后,槽函數才會被調用。多線程環境下一般用這個。

        QObject::connect(this,
                        &MyClass::signals_dosomething,
                        this,
                        &MyClass::slots_dosomething,
                        Qt::DirectConnection);

更多

參考鏈接

  1. Qt多線程中的信號-槽


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM