gpt4 book ai didi

c++ - 在非 Qt 线程中使用 Qt 信号/槽

转载 作者:可可西里 更新时间:2023-11-01 18:27:13 26 4
gpt4 key购买 nike

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

Qt 信号/槽机制如何与非 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 的互斥量将与其他线程一起工作(只要它们也使用相同的 native API)。

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

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

Note: This function is thread-safe.

如果对象正确设置了线程关联(使用 moveToThread 方法),则无需显式设置连接类型,默认设置为 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建议非 Qt 线程也应该被 Qt 的方法正确识别 - currentThread即使对于非 Qt 线程,也应该返回一个 QThread 实例,因为它只是 native 线程的包装器。

关于c++ - 在非 Qt 线程中使用 Qt 信号/槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27947293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com