執行緒的信號槽機制需要開啟執行緒的事件回圈機制,即呼叫QThread::exec()函式開啟執行緒的事件回圈,
Qt信號-槽連接函式原型如下:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection )
Qt支持5種連接方式
- Qt::DirectConnection(直連方式)(信號與槽函式關系類似于函式呼叫,同步執行)
當信號發出后,相應的槽函式將立即被呼叫,emit陳述句后的代碼將在所有槽函式執行完畢后被執行,當信號發射時,槽函式將直接被呼叫,無論槽函式所屬物件在哪個執行緒,槽函式都在發射信號的執行緒內執行, - Qt::QueuedConnection(佇列方式)(此時信號被塞到事件佇列里,信號與槽函式關系類似于訊息通信,異步執行)
當信號發出后,排隊到信號佇列中,需等到接收物件所屬執行緒的事件回圈取得控制權時才取得該信號,呼叫相應的槽函式,emit陳述句后的代碼將在發出信號后立即被執行,無需等待槽函式執行完畢,當控制權回到接收者所依附執行緒的事件回圈時,槽函式被呼叫,槽函式在接收者所依附執行緒執行, - Qt::AutoConnection(自動方式)
Qt的默認連接方式,如果信號的發出和接收信號的物件同屬一個執行緒,那個作業方式與直連方式相同;否則作業方式與佇列方式相同,如果信號在接收者所依附的執行緒內發射,則等同于直接連接如果發射信號的執行緒和接受者所依附的執行緒不同,則等同于佇列連接 - Qt::BlockingQueuedConnection(信號和槽必須在不同的執行緒中,否則就產生死鎖)
槽函式的呼叫情形和Queued Connection相同,不同的是當前的執行緒會阻塞住,直到槽函式回傳, - Qt::UniqueConnection
與默認作業方式相同,只是不能重復連接相同的信號和槽,因為如果重復連接就會導致一個信號發出,對應槽函式就會執行多次,
如果沒有特殊的要求我們connect函式選擇默認的連接方式就好,也就是connect的第五個引數不填寫就ok,例如:
connect(m_obj, &QObject::destroyed, this, &MainWindow::SetPtrNullptr);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/209824.html
標籤:C++
