使用Qt信号/槽与非Qt线程

7
我已经尽力找到答案,但无法回答以下问题:
Qt信号/槽机制如何与非Qt线程交互?
特别地,从一个非Qt(例如TBB)线程发出信号,被主事件循环中的一个槽捕获是否安全?假设我明确使用排队连接将其连接起来?(我的感觉是指定连接为排队连接是必需的;这正确吗?)
(作为一个附加问题,我一直认为Qt同步类,例如QMutex,可以跨非Qt线程工作。这正确吗?)
(作为澄清的说明,我担心的是,如果它没有检测到信号是从不同的Qt线程发出的,则排队连接机制将不使用保护措施,例如互斥锁,将元调用添加到主线程事件队列中。)
(最后的补充:我相信因为Qt机制是基于特定于平台的原语实现的,所以实践中我正在尝试做的所有事情都会优雅地工作,但我也想知道Qt是否提供任何保证这些事情会工作。)
1个回答

11

documentation指出:

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

所以,是的,Qt的互斥锁将适用于其他线程(只要它们还使用相同的本地API)。

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

与信号相关的函数,主要是processEventspostEvent被认为是线程安全的:

注意:此函数是线程安全的。 如果对象已经正确设置了线程关联(使用moveToThread方法),则不需要显式地设置连接类型,默认的AutoConnection会按照以下方式工作: (默认)如果信号在接收对象具有关联的线程中发射,则行为与直接连接相同。否则,行为与排队连接相同。 此回答建议Qt的方法也应该正确识别非Qt线程 - 即使对于非Qt线程,currentThread也应该返回一个QThread实例,因为它只是原生线程的包装器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接