2014-04-02 69 views
0

我想知道qt如何决定哪种调度信号的工作方式。qt发射信号如何将信号与并发线程一起工作

http://qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads 我发现

Auto Connection (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.

什么是在这种情况下,意义affinity

Qt如何知道哪个线程使用对象的方法来防止信号数据损坏? affinity线程是创建对象的线程吗?

回答

1

除非调用moveToThread,否则每个QObject都绑定到特定线程(可通过thread() function查询),默认情况下为创建该对象的那个线程。

每个对象都具有与其父项相同的线程。

+0

的螺纹上的事件:“每个对象与它的父对象具有相同的线程“,这是否意味着在另一个线程中创建子对象会从父对象”继承“线程”affinity“? – Klaus

+1

您不能在另一个线程上使用对象的父对象。作为moveToThread状态的文档:“这个函数只能将一个对象从当前线程”推送“到另一个线程,它不能将一个对象从任意线程”拉“到当前线程。” – TheDarkKnight

0

对象的线程关联是该对象执行的线程。

一个对象从它创建的线程开始,它的线程亲和性就是该线程。在其整个生命周期中,它可以移动到不同的线程,这将改变线程的亲和力。

发送信号时,Qt会查看发送和接收对象的线程关联性。如果他们具有相同的亲和力(在同一个线程上运行),则建立直接连接。

然而,如果两个对象具有不同的线程的亲和性(在不同的线程中运行),则发送方如果你说宿接收对象,这是使用一个排队连接