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 完全同一条路

浙公网安备 33010602011771号