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);