【问题标题】:Qt: Do events get processed in order?Qt:事件是否按顺序处理?
【发布时间】:2010-12-16 12:33:40
【问题描述】:

如果我有一个 A 类,其中一个功能是:

void A::func()
{
    emit first_signal();
    emit second_signal();
}

假设 B 类有 2 个插槽,一个连接到 first_signal,另一个连接到 second_signal,是否保证连接到 first_signal 的插槽将始终为在second_signal之前处理?

【问题讨论】:

    标签: qt signals-slots


    【解决方案1】:

    如果你在信号和槽之间使用直接连接类型(Qt::DirectConnection)那么答案是肯定的。

    来自Qt帮助系统:

    当一个信号发出时,槽 连接到它通常被执行 立即,就像正常人一样 函数调用。 发生这种情况时, 信号和槽机制完全 独立于任何 GUI 事件循环。 执行以下代码 发出语句将发生一次 插槽已返回。 情况是 使用排队时略有不同 连接;在这种情况下,代码 在发出关键字之后将 立即继续,并且插槽 稍后执行。

    您可以在QObject::connect 方法中将默认连接类型更改为enum Qt::ConnectionType 中的任何一个。

    【讨论】:

    • 我认为只要它们具有相同的类型就可以保证,即使它不是默认的。排队的人将创建两个事件,每个事件具有相同的优先级,然后这些事件将按顺序处理。此外,默认连接类型是 Qt::AutoConnection,只要发射器和接收器都在同一个线程中,它就解析为直接。
    • 你帖子的开头句应该是If you use DIRECT connection type between signals and slots;因为默认类型是Qt::AutoConnection,它的行为会根据发送代码和接收对象是否存在于不同的线程中而有所不同。见Qt::ConnectionType docsThreads, Events and QObjects
    • 如果您选择 Qt::QueuedConnection (或 Qt::AutoConnection 并且插槽与信号位于不同的线程中),当然插槽将被异步调用,但我认为问题仍然存在“是否保证连接到 first_signal 的 slot 总是在 second_signal slot 之前被处理?”有人回答了吗?
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多