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在这样的线程中运行事件循环(),一切都应该正常工作.
信号相关的功能,主要是processEvents和postEvent被说成是线程安全的:
注意:此功能是线程安全的.
如果对象具有正确设置的线程关联(使用该moveToThread方法),则无需显式设置连接类型,默认设置AutoConnection如下:
(默认)如果在接收对象具有亲和力的线程中发出信号,则行为与直接连接相同.否则,行为与排队连接相同.
这个答案表明非Qt线程也应该通过Qt的方法正确识别 - 即使对于非Qt线程也currentThread应该返回一个QThread实例,因为它只是本机线程的包装器.
| 归档时间: |
|
| 查看次数: |
1081 次 |
| 最近记录: |