2014-09-11 46 views
4

将对象从一个线程移动到另一个线程时,moveToThread()是否会自动将现有直接连接重写为排队连接?moveToThread()是否重写与排队连接的直接连接?

或者换句话说:如果在moveToThread()的调用之前或之后建立自动连接,它是否重要?

不幸的是,文档和WWW都没有在这个问题上的答案。

+0

我检查了错误的部分。我专注于moveToThread()和connect()并错过了检查连接类型枚举文档,因为我当然不希望在信号发射时检查连接类型。 – Silicomancer 2014-09-11 09:29:57

+2

你可以在[源代码](https://qt.gitorious.org/qt/qtbase/source/9754e5a03e4444a18ec7ca1525d196326ff4e038:src/corelib/kernel/qobject.cpp#L3516)中看到它,如果你有兴趣的话。 – thuga 2014-09-11 11:18:02

+1

连接类型*必须*在信号发射时检查,因为信号可以从任何地方*发射,线程安全。即使从外国线程。例如,从C库的回调中发出信号是一种标准惯用语。没有这样的发射时间检查,自动连接类型将是不可能的。虽然* slot *与对象的线程上下文相关联,但信号不是 - 它仅与发送对象的连接列表关联。 – 2014-09-11 14:45:04

回答

5

根据Qt documentation:如果接收器驻留在发出信号的线程中,则使用Qt :: DirectConnection。否则,使用Qt :: QueuedConnection。 当信号发射时,连接类型确定为

+0

地狱,我错过了那句话!我学到了一些非常重要的东西......我一直认为建立连接时确定了实际的连接类型。 – Silicomancer 2014-09-11 09:27:43

4

没有所有直接连接保持直接,所有排队的连接保持排队。

但是,自动连接将决定在发射时是否排队或直接呼叫。因此,相对于moveToThread设置自动连接时无关紧要。