- 📢博客主頁:https://loewen.blog.csdn.net
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 丶布布原創,首發于 CSDN,轉載注明出處🙉
- 📢現在的付出,都會是一種沉淀,只為讓你成為更好的人?
文章預覽:
- 一. 前言
- 二. 作用
- 三. 使用場景
一. 前言
QMetaObject::invokeMethod
結合 Qt::QueuedConnection
的作用是實現跨線程安全調用或異步執行方法。其核心目的是確保方法在目標對象的線程事件循環中執行,避免多線程競爭或直接操作UI線程的隱患。
二. 作用
QMetaObject::invokeMethod(this, [=]() {/*代碼主體*/}, Qt::QueuedConnection);
1、跨線程調用
若當前代碼運行不在主線程中執行,在非目標對象(this)所屬線程(如子線程),Qt::QueuedConnection
會將方法調用封裝為事件,投遞到目標線程的事件隊列。目標線程會在下一次事件循環時處理該請求,從而保證線程安全。
2、異步執行
即使在同一線程,使用 Qt::QueuedConnection
也會將方法調用延遲到事件循環的下一周期執行。這可以避免當前代碼塊未完成時直接調用方法可能引發的重入問題。
三. 使用場景
1、多線程環境
子線程需要更新UI或訪問主線程資源時(如修改控件狀態),必須通過隊列連接將操作轉發到主線程執行。例如:
// 子線程中更新UI
QMetaObject::invokeMethod(ui->label, "setText", Qt::QueuedConnection, Q_ARG(QString, "Done"));
//UI界面端操作需要轉移到主線程進行繪制,否則會崩潰
QMetaObject::invokeMethod(this, [=] {m_sharedDataset->mainView()->setPen(QColor("yellow"));m_sharedDataset->mainView()->dispPath(pathFromHXLDCont(ho_Circle));});
2、避免重入或死鎖
若某方法可能被遞歸調用或需要等待當前操作完成,異步執行可防止堆棧溢出或邏輯沖突。
3、解耦耗時操作與響應
主線程需要保持響應性時,可將耗時操作提交到子線程,再通過隊列連接返回結果。
下雨天,最愜意的事莫過于躺在床上靜靜聽雨,雨中入眠,連夢里也長出青苔。 |