Qt之信號(hào)槽淺探

連接類型

AutoConnection (Qt::AutoConnection):根據(jù)對(duì)象所在的線程自動(dòng)選擇合適的連接類型曹宴。如果信號(hào)發(fā)送者和接收者在同一線程中運(yùn)行滞谢,則使用直接連接旱易;否則使用隊(duì)列連接偏瓤。
DirectConnection (Qt::DirectConnection):信號(hào)發(fā)送時(shí)份乒,槽函數(shù)會(huì)在發(fā)送信號(hào)的線程中立即執(zhí)行恕汇。適用于信號(hào)發(fā)送者和接收者在同一線程中運(yùn)行的情況。

直接連接時(shí)或辖,信號(hào)與槽之間的響應(yīng)形式為同步的直接調(diào)用瘾英,調(diào)用流程如下:
emit signal-->QMetaObject::activate-->QSlotObjectBase::call-->receiver::slot

QueuedConnection (Qt::QueuedConnection):信號(hào)發(fā)送時(shí),將槽函數(shù)調(diào)用封裝為一個(gè)事件并放入接收者所在線程的事件隊(duì)列中孝凌,槽函數(shù)會(huì)在接收者的線程中執(zhí)行方咆。適用于跨線程通信的情況。

隊(duì)列連接時(shí)蟀架,信號(hào)發(fā)送時(shí)瓣赂,判斷類型為c->connectionType == Qt::QueuedConnection,構(gòu)造一個(gè)MetaCall事件片拍,通過 QCoreApplication::postEvent將事件加到事件隊(duì)列中在事件循環(huán)處理煌集,調(diào)用流程如下:
emit signal-->QMetaObject::activate-->queued_activate ...事件循環(huán)...
QEventDispatcherWin32::sendPostedEvents-->QEvent::MetaCall-->receiver::slot

    QMetaCallEvent *ev = c->isSlotObject ?
        new QMetaCallEvent(c->slotObj, sender, signal, nargs, types, args) :
        new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal, nargs, types, args);
    QCoreApplication::postEvent(c->receiver, ev);

BlockingQueuedConnection (Qt::BlockingQueuedConnection):(慎用,sender和reciver處于同線程時(shí)會(huì)出現(xiàn)死鎖)類似于隊(duì)列連接捌省,但發(fā)送信號(hào)的線程會(huì)阻塞苫纤,直到槽函數(shù)在接收者的線程中執(zhí)行完成。常用于需要確保信號(hào)和槽按順序執(zhí)行的情況纲缓。

Qt: Dead lock detected while activating a BlockingQueuedConnection: Sender is Sender(0x32ffe64), receiver is Worker(0x32ffe3c)

UniqueConnection (Qt::UniqueConnection):防止重復(fù)連接相同的信號(hào)和槽卷拘,使用UniqueConnection進(jìn)行連接時(shí),如果是已存在的連接則本次不會(huì)重復(fù)連接祝高。

除了加UniqueConnection栗弟,否則同一reciver多次connect時(shí)都會(huì)被加入到列表中,在sender發(fā)送信號(hào)時(shí)被多次調(diào)用
QObject::connect(&mainWindow.sender, &Sender::signalToSend, &worker, &Worker::doWork);
QObject::connect(&mainWindow.sender, &Sender::signalToSend, &worker, &Worker::doWork);

recever被銷毀時(shí)工闺,自動(dòng)從sender的list = &connectionLists->at(signal_index);中移除乍赫。在QObject對(duì)象銷毀時(shí),會(huì)把處于posted事件隊(duì)列中的事件全部刪除陆蟆,所以QEvent::MetaCall在對(duì)象銷毀后也不會(huì)調(diào)用雷厂。

QObjectPrivate::~QObjectPrivate()
{
...
    if (postedEvents)
        QCoreApplication::removePostedEvents(q_ptr, 0);
...
}

那么,什么情況下會(huì)出現(xiàn)對(duì)象銷毀叠殷,又觸發(fā)信號(hào)
void QObjectPrivate::deleteChildren()

為啥對(duì)象在delete后改鲫,繼續(xù)發(fā)送關(guān)聯(lián)該對(duì)象槽函數(shù)的信號(hào)時(shí),觸發(fā)的receiver是空的


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市像棘,隨后出現(xiàn)的幾起案子纫塌,更是在濱河造成了極大的恐慌,老刑警劉巖讲弄,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件措左,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡避除,警方通過查閱死者的電腦和手機(jī)怎披,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓶摆,“玉大人凉逛,你說我怎么就攤上這事∪壕” “怎么了状飞?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)书斜。 經(jīng)常有香客問我诬辈,道長(zhǎng),這世上最難降的妖魔是什么荐吉? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任焙糟,我火速辦了婚禮,結(jié)果婚禮上样屠,老公的妹妹穿的比我還像新娘穿撮。我一直安慰自己,他們只是感情好痪欲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布悦穿。 她就那樣靜靜地躺著,像睡著了一般业踢。 火紅的嫁衣襯著肌膚如雪栗柒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天陨亡,我揣著相機(jī)與錄音傍衡,去河邊找鬼深员。 笑死负蠕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倦畅。 我是一名探鬼主播遮糖,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼叠赐!你這毒婦竟也來了欲账?” 一聲冷哼從身側(cè)響起屡江,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赛不,沒想到半個(gè)月后惩嘉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踢故,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年文黎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殿较。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耸峭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淋纲,到底是詐尸還是另有隱情劳闹,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布洽瞬,位于F島的核電站本涕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伙窃。R本人自食惡果不足惜偏友,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望对供。 院中可真熱鬧位他,春花似錦、人聲如沸产场。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)京景。三九已至窿冯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間确徙,已是汗流浹背醒串。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鄙皇,地道東北人芜赌。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像伴逸,于是被迫代替她去往敵國(guó)和親缠沈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容