将 Qt signals/slots 与非 Qt 线程一起使用

Using Qt signals/slots with non-Qt threads

我已尽职调查,但找不到这个问题的答案:

Qt signal/slot 机制如何与非 Qt 线程交互?

特别是,从非 Qt(例如 TBB)线程发出信号并被我的主事件循环中的插槽捕获是否安全?假设我明确地将它与排队连接连接起来? (我的感觉是指定连接排队是强制性的;这样正确吗?)

(作为附带问题,我一直假设 Qt 同步 类,例如 QMutex,跨非 Qt 线程工作。这是正确的吗?)

(澄清一下,我担心的是排队连接机制不会使用守卫,例如互斥锁,如果它没有检测到信号正在从不同的 Qt 线程发出。)

(最后补充:我可以相信,因为 Qt 机制是根据特定于平台的原语实现的,所以在实践中,我尝试做的所有事情都会优雅地工作,但我也想知道 Qt 是否提供任何保证这些东西会工作。)

documentation 状态:

Note: Qt's threading classes are implemented with native threading APIs; e.g., Win32 and pthreads. Therefore, they can be used with threads of the same native API.

所以,是的,Qt 的互斥量将与其他线程一起工作(只要它们也使用相同的本机 API)。

Qt 线程与其他线程的区别在于其他线程永远不会有Qt 的事件循环运行ning,因此将无法接收和处理任何信号。但是,如果您将 运行 事件循环 (exec) 放在这样的线程中,一切都应该可以正常工作。

信号相关函数,主要processEvents and postEvent据说是线程安全的:

Note: This function is thread-safe.

如果对象的线程关联设置正确(使用 moveToThread method) you don't need to set the connection type explicitly, the default AutoConnection 的工作方式如下:

(default) If the signal is emitted in the thread which the receiving object has affinity then the behavior is the same as the Direct Connection. Otherwise, the behavior is the same as the Queued Connection.

This answer suggests that non-Qt threads should also be correctly identifiable by Qt's methods - currentThread 应该 return 一个 QThread 实例,即使对于非 Qt 线程也是如此,因为它只是本机线程的包装器。