QT源碼之Qt信號槽機(jī)制與事件機(jī)制的聯(lián)系
QT源碼之Qt信號槽機(jī)制與事件機(jī)制的聯(lián)系是本文要介紹的內(nèi)容,通過解決一個(gè)問題,從中分析出的理論,先來看內(nèi)容。
本文就是來解決一個(gè)問題,就是當(dāng)signal和slot的連接為Qt::QueuedConnection,這時(shí)候這個(gè)連接是怎么分發(fā)處理的。下面就結(jié)合一下Qt的源代碼來分析一下。
- view plaincopy to clipboardprint?
- if ((c->connectionType == Qt::AutoConnection
- && (currentThreadData != sender->d_func()->threadData
- || receiver->d_func()->threadData != sender->d_func()->threadData))
- || (c->connectionType == Qt::QueuedConnection)) {
- queued_activate(sender, signal, *c, argv);
- continue;
- } else if (c->connectionType == Qt::BlockingQueuedConnection) {
- blocking_activate(sender, signal, *c, argv);
- continue;
- }
- if ((c->connectionType == Qt::AutoConnection
- && (currentThreadData != sender->d_func()->threadData
- || receiver->d_func()->threadData != sender->d_func()->threadData))
- || (c->connectionType == Qt::QueuedConnection)) {
- queued_activate(sender, signal, *c, argv);
- continue;
- } else if (c->connectionType == Qt::BlockingQueuedConnection) {
- blocking_activate(sender, signal, *c, argv);
- continue;
- }
這段代碼的意思是:當(dāng)前connectionType為Qt::AutoConnection并且,signal和slot不在一個(gè)線程或者是signal和不再當(dāng)前線程中;或者是c->connectionType為 Qt::QueuedConnection這時(shí)候調(diào)用函數(shù)
queued_activate,如果c->connectionType 為Qt::BlockingQueuedConnection則調(diào)用函數(shù)blocking_activate
我們當(dāng)queued_activate和blocking_activate一樣就可以了。
queued_activate函數(shù)很簡單,就是對參數(shù)轉(zhuǎn)換一下,然后調(diào)用
- QCoreApplication::postEvent(c.receiver, new QMetaCallEvent(c.method,sender,signal,nargs,types,args,semaphore));
注意: postEvent第二個(gè)參數(shù)是QMetaCallEvent。這樣這個(gè)signal-slot的connection就發(fā)送到receiver的消息隊(duì)列中去了。
接下來消息隊(duì)列如何處理QMetaCallEvent,請參考QT源碼解析剖析Qt的事件機(jī)制原理(詳解 QT 源碼之 Qt 事件機(jī)制原理)
后記:通過這種方法Qt實(shí)現(xiàn)了跨線程的signal-slot傳遞,并且這種signal-slot機(jī)制的傳遞是利用消息隊(duì)列,所以說是線程安全的。
小結(jié):關(guān)于QT源碼之Qt信號槽機(jī)制與事件機(jī)制的聯(lián)系的問題介紹完了,希望本文對你有幫助。