日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6. Qt 信号与信号槽 (7)-QMetaObject:: activate

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6. Qt 信号与信号槽 (7)-QMetaObject:: activate 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最后調用callFunction() 或者metaCall()

void QMetaObject::activate(QObject *sender, int from_signal_index, int to_signal_index, void **argv) {// 這里得到的是QObject的數據,首先判斷是否為阻塞設置if (sender->d_func()->blockSig)return;// 得到全局鏈表QConnectionList * const list = ::connectionList();if (!list)return;QReadLocker locker(&list->lock);void *empty_argv[] = { 0 };if (qt_signal_spy_callback_set.signal_begin_callback != 0) {locker.unlock();qt_signal_spy_callback_set.signal_begin_callback(sender, from_signal_index,argv ? argv : empty_argv);locker.relock();}// 在sender的哈希表中得到sender的連接QConnectionList::Hash::const_iterator it = list->sendersHash.find(sender);const QConnectionList::Hash::const_iterator end = list->sendersHash.constEnd();if (it == end) {if (qt_signal_spy_callback_set.signal_end_callback != 0) {locker.unlock();qt_signal_spy_callback_set.signal_end_callback(sender, from_signal_index);locker.relock();}return;}QThread * const currentThread = QThread::currentThread();const int currentQThreadId = currentThread ? QThreadData::get(currentThread)->id : -1;// 記錄sender連接的索引QVarLengthArray<int> connections;for (; it != end && it.key() == sender; ++it) {connections.append(it.value());// 打上使用標記,因為可能是放在隊列中list->connections[it.value()].inUse = 1;}for (int i = 0; i < connections.size(); ++i) {const int at = connections.constData()[connections.size() - (i + 1)];QConnectionList * const list = ::connectionList();// 得到連接QConnection &c = list->connections[at];c.inUse = 0;if (!c.receiver || (c.signal < from_signal_index || c.signal > to_signal_index))continue;// 判斷是否放到隊列中// determine if this connection should be sent immediately or// put into the event queueif ((c.type == Qt::AutoConnection&& (currentQThreadId != sender->d_func()->thread|| c.receiver->d_func()->thread != sender->d_func()->thread))|| (c.type == Qt::QueuedConnection)) {::queued_activate(sender, c, argv);continue;}// 為receiver設置當前發送者const int method = c.method;QObject * const previousSender = c.receiver->d_func()->currentSender;c.receiver->d_func()->currentSender = sender;list->lock.unlock();if (qt_signal_spy_callback_set.slot_begin_callback != 0)qt_signal_spy_callback_set.slot_begin_callback(c.receiver, method, argv ? argv : empty_argv); #if defined(QT_NO_EXCEPTIONS)c.receiver->qt_metacall(QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv); #elsetry {// 調用receiver的方法c.receiver->qt_metacall(QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);} catch (...) {list->lock.lockForRead();if (c.receiver)c.receiver->d_func()->currentSender = previousSender;throw;} #endifif (qt_signal_spy_callback_set.slot_end_callback != 0)qt_signal_spy_callback_set.slot_end_callback(c.receiver, method);list->lock.lockForRead();if (c.receiver)c.receiver->d_func()->currentSender = previousSender;}if (qt_signal_spy_callback_set.signal_end_callback != 0) {locker.unlock();qt_signal_spy_callback_set.signal_end_callback(sender, from_signal_index);locker.relock();} }void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_index, void **argv) {int signal_index = signalOffset + local_signal_index;/* 我們所做的第一件事,是快速檢查一個 64 位的位蒙版 bit-mask。如果為 0,* 我們就知道沒有連接到該信號的東西,可以迅速返回,* 這意味著,發送一個沒有與槽連接的信號是相當迅速的。*/if (!sender->d_func()->isSignalConnected(signal_index))return; // nothing connected to these signals, and no spy/* ... 跳過調試信息和 QML 調用,以及一些合理性檢查 ... *//* 使用互斥鎖,因為 connectionList 中的所有操作都是線程安全的 */QMutexLocker locker(signalSlotLock(sender));/* 獲取該信號的 ConnectionList。此處做了一些簡化。真實的代碼還為列表添加了引用計數和一些合理性檢查 */QObjectConnectionListVector *connectionLists = sender->d_func()->connectionLists;const QObjectPrivate::ConnectionList *list =&connectionLists->at(signal_index);QObjectPrivate::Connection *c = list->first;if (!c) continue;// 我們需要最后一次檢查,確保在信號發出的過程中添加的信號不會在本次發出過程被觸發。QObjectPrivate::Connection *last = list->last;/* 遍歷槽 */do {if (!c->receiver)continue;QObject * const receiver = c->receiver;const bool receiverInSameThread = QThread::currentThreadId() == receiver->d_func()->threadData->threadId;// 確定該連接應該立即發出,還是放入事件隊列if ((c->connectionType == Qt::AutoConnection && !receiverInSameThread)|| (c->connectionType == Qt::QueuedConnection)) {/* 從根本上說,就是復制參數,發出事件 */queued_activate(sender, signal_index, c, argv);continue;} else if (c->connectionType == Qt::BlockingQueuedConnection) {/* ... 跳過 ... */continue;}/* 助手結構體,設置 sender()(并且在超出作用域之后重新設回 */QConnectionSenderSwitcher sw;if (receiverInSameThread)sw.switchSender(receiver, sender, signal_index);const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction;const int method_relative = c->method_relative;if (c->isSlotObject) {/* ... 跳過 ... Qt5 風格的指向函數指針的連接 */} else if (callFunction && c->method_offset metaObject()->methodOffset()) {/* 如果存在 callFunction(指向由 moc 生成的 qt_static_metacall 的指針,* 調用該函數。還需要檢查已保存的 metodOffset 是否依舊可用* (因為我們可能在析構函數中調用) */locker.unlock(); // 實際調用時不能持有鎖callFunction(receiver, QMetaObject::InvokeMetaMethod, method_relative, argv);locker.relock();} else {/* 動態對象 */const int method = method_relative + c->method_offset;locker.unlock();metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv);locker.relock();}// 檢查該對象是否被槽析構if (connectionLists->orphaned) break;} while (c != last && (c = c->nextConnectionList) != 0); }

總結

以上是生活随笔為你收集整理的6. Qt 信号与信号槽 (7)-QMetaObject:: activate的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 丝袜诱惑一区 | 日韩不卡免费视频 | 18岁免费观看电视连续剧 | 在线观看天堂av | 成年女人免费视频 | 性做爰裸体按摩视频 | 中文字幕精品无 | 亚洲精品乱码久久久久久国产主播 | 亚洲成av人片在线观看无码 | 久精品在线 | 91香蕉国产在线观看软件 | www日韩在线观看 | 日本捏奶吃奶的视频 | 日本不卡一二三区 | 动漫精品一区二区三区 | 免费成人视屏 | 久久久中文| 好妞色妞国产在线视频 | 快灬快灬一下爽69 | 顶级黑人搡bbw搡bbbb搡 | www.好吊色 | 18精品爽国产白嫩精品 | 欧美亚州 | 在线三区 | 男人的天堂狠狠干 | 中文有码av | 国产爱搞 | 夜夜高潮夜夜爽国产伦精品 | 免费在线h| 亚洲h片 | 色哥网 | 精品人妻无码一区二区三区蜜桃一 | 99在线观看免费视频 | 中国特级黄色片 | 日韩一区二区毛片 | 69精品在线 | 日韩中文字幕在线观看 | 青青草免费观看视频 | 性欧美精品 | 艳妇臀荡乳欲伦交换在线播放 | wwwwww国产| 久久精品99久久久久久久久 | 亚洲综合av一区二区三区 | 欧美日韩在线观看一区二区 | 中文字幕有码在线观看 | www.激情五月 | 毛片在哪看 | 国产一区中文 | 亚洲a色| xxxx国产精品 | 极品国产一区 | 91精品国产综合久久久蜜臀图片 | 亚洲乱色 | 97在线免费观看 | 影音先锋久久久久av综合网成人 | 黑人巨大精品一区二区在线 | 国产又爽又黄免费视频 | 久久综合热 | 自拍视频一区 | 国产精品免费视频一区 | 九一成人网 | 波多野结衣在线观看一区二区三区 | 成人爱爱| 91porn九色 | 美女精品在线观看 | www.麻豆av| 最新色视频| 美女诱惑av | 亚州春色 | 国产精品免费视频一区二区三区 | 亚洲精品欧美日韩 | 夜久久 | 91久久久久久 | 日韩成人无码影院 | 羞羞网站在线观看 | 国产精品女人和拘 | 国内精品国产成人国产三级 | 在线免费视频 | 可以免费看的黄色网址 | 放荡闺蜜高h苏桃情事h | 免费黄色小网站 | 国产又粗又长 | 五月婷婷开心 | 亚洲小说专区 | 天天看av| 成人黄色片免费看 | 国产网友自拍视频 | 青青欧美| 国产ts三人妖大战直男 | 亚洲一区二区三区免费 | 成人精品在线 | 亚洲v国产| 欧美日韩综合一区二区 | 视频一区 中文字幕 | aaa黄色一级片 | 欧美丝袜视频 | 国产美女激情视频 | 在线观看免费大片 | 久久精品国产欧美亚洲人人爽 |