我在使用Qt信号的麻烦。
我不知道如何DirectConnection
和QueuedConnection
的作品?
我很感激,如果有人会解释时所使用的这些(示例代码,将不胜感激)。
我在使用Qt信号的麻烦。
我不知道如何DirectConnection
和QueuedConnection
的作品?
我很感激,如果有人会解释时所使用的这些(示例代码,将不胜感激)。
你不会看到太大的区别,除非你具有不同的线程亲和力对象工作。 比方说,你必须的QObject A
和B
和他们都连接到不同的线程。 A
有一个称为信号somethingChanged()
和B
有一个称为时隙handleChange()
如果您使用直接连接
connect( A, SIGNAL(somethingChanged()), B, SLOT(handleChange()), Qt::DirectConnection );
该方法handleChange()
将在实际运行A
的线程。 基本上,它是因为如果发射信号称为“直接”槽方法。 如果B::handleChange()
不是线程安全的,这可能会导致一些(很难找到)错误。 最起码,你在额外的线程的好处错过了。
如果你改变了连接方法Qt::QueuedConnection
(或者,在这种情况下,让Qt的决定使用哪种方法),事情变得更有趣。 假设B
的线程正在运行一个事件循环,发射信号将事件张贴到B
的事件循环。 事件循环队列的情况下,并最终调用方法时隙每当控制返回到它(它是事件循环)。 这使得它很容易应对的Qt线程之间/之间的通信(同样,假设你的线程运行自己的本地事件循环)。 你不必担心锁具等,因为事件循环序列化插槽调用。
注意:如果你不知道如何改变一个QObject的线程关联,考虑QObject::moveToThread
。 这应该让你开始。
编辑
我要澄清我的开篇句。 它确实有差别,如果你指定一个排队的连接-即使是在同一线程上的两个对象。 本次活动还发布到线程的事件循环。 因此,该方法调用仍然是异步的,这意味着它可以在不可预知的方式(取决于任何其他事件循环可能需要处理)被延迟。 但是,如果不指定连接方法,直接方法被自动用于同一线程上的对象之间的连接(至少它是使用Qt 4.8)。
除了雅各布·罗宾斯的答案:
语句“你不会看到太多的差别,除非你具有不同的线程亲和力对象”是错误的 ;
发射信号到同一个线程内的直接连接将立即执行槽,就像一个简单的函数调用。
发射信号到同一个线程中排队的连接将排队所述呼叫到所述线程的事件循环,从而执行将总是发生延迟。
QObject的基础类有一个排队连接到其自身
雅各布的回答是真棒。 我只是想以一个比较实例添加到嵌入式编程。
从嵌入式RTOS / ISR背景的人,这是有益的,看看在Qt的DirectConnection到ISR和Qt的QueuedConnection的抢占行为相似,以任务之间排队的消息在RTOS。
附注:从嵌入式背景的人,这是我很难不定义编程的行为。 我永远不会离开的说法为自动,但只是个人意见。 我宁愿被明确写入了一切,是的,有时变得困难了!