- 📢博客主页: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、解耦耗时操作与响应
主线程需要保持响应性时,可将耗时操作提交到子线程,再通过队列连接返回结果。
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |