使用带有非Qt线程的Qt信号/插槽

And*_*nko 7 c++ qt multithreading

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

Qt信号/插槽机制如何与非Qt线程交互?

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

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

(作为一个澄清的评论,我担心的是排队的连接机制不会使用保护,例如互斥,如果它没有检测到信号是从哪个发出的,那么将metacall添加到主线程事件队列一个不同的Qt线程.)

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

Bar*_*zKP 10

文件规定:

注意: Qt的线程类是使用本机线程API实现的; 例如,Win32和pthreads.因此,它们可以与相同本机API的线程一起使用.

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

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

信号相关的功能,主要是processEventspostEvent被说成是线程安全的:

注意:此功能是线程安全的.

如果对象具有正确设置的线程关联(使用该moveToThread方法),则无需显式设置连接类型,默认设置AutoConnection如下:

(默认)如果在接收对象具有亲和力的线程中发出信号,则行为与直接连接相同.否则,行为与排队连接相同.

这个答案表明非Qt线程也应该通过Qt的方法正确识别 - 即使对于非Qt线程也currentThread应该返回一个QThread实例,因为它只是本机线程的包装器.