Qt 跨线程安全调用

在 "接收者对象所属线程" 的上下文里调用它的方法 / 函数—— 不依赖信号槽连接,直接投递一个 "调用请求",由接收者线程的事件循环来执行

template <typename Functor>
bool QMetaObject::invokeMethod(QObject *context, Functor &&f,
                               Qt::ConnectionType type = Qt::AutoConnection, ...);

context 决定 "去哪个线程执行",type 决定 "怎么执行"

四种 ConnectionType 原理

四类对比
Direct → 调用者线程、同步、等同普通调用(跨线程危险)
Queued → 接收者线程、异步、事件队列投递(工程主力,安全)
Blocking → 接收者线程、同步、投递后等待完成(只用于关库析构,防死锁)
Auto → 运行时按线程归属自动选 Direct/Queued(信号槽默认)

与信号槽的关系(同源)

connect(sender, signal, receiver, slot, type)
  信号 emit 时 ↓ 内部
    封装 QMetaCallEvent → postEvent / 直接调用     ← 和 invokeMethod 完全同一条路

posted @ 2026-09-10 10:54  twjy  阅读(7)  评论(0)    收藏  举报