[Qt5] QMetaObject::invokeMethod使用

  • 博客主页: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、解耦耗时操作与响应

主线程需要保持响应性时,可将耗时操作提交到子线程,再通过队列连接返回结果。


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。

你可能感兴趣的:(#,GUI,◎,QT5,qt,开发语言)