事件队列是否与用于跨线程信号/槽的队列相同(在Qt中)?

时间:2011-12-13 10:43:01

标签: c++ qt message-queue signals-slots

我想知道Qt中的排队事件是否与事件和信号相同(不是从与接收到的插槽相同的线程发出的,因此排队。)

所以要明确,我们有:

  • 一个事件队列
  • 信号的一个队列(由于不同线程中的发射/插槽,无法直接执行)

还是我们有

  • 一个事件和信号队列

1 个答案:

答案 0 :(得分:3)

只有一个队列。 invokeMethod()生成一个QEvent,它是一个“QMetaCallEvent”。它是事件索引43,您可以在此处看到QEvent::MetaCall

http://doc.qt.io/qt-5/qevent.html#Type-enum

它被放入qmetaobject.cpp ...的队列中,其中“调用”触发对QApplication的postEvent的调用。以下是在更新broken gitorious links

时编写 时该行的链接

/src/corelib/kernel/qmetaobject.cpp line 2228

没有传递“优先级”参数,因此信号/插槽调用始终为Qt::NormalEventPriority

这个细节在文档中并没有真正合同布局,所以我会谨慎地假设将来对每个平台和版本的行为过多。如果您需要在程序的某些部分订购严格的事件处理合同,那么最好编写自己的显式协议。