【问题标题】:Wait for a SLOT to finish the execution with Qt等待 SLOT 使用 Qt 完成执行
【发布时间】:2017-02-01 16:41:20
【问题描述】:

在我的代码中,我发出一个信号 (mySignal),我想等待连接的插槽 (mySlot) 执行结束,然后再继续:

emit mySignal();
// Wait for the end of mySlot execution...

// Some code that has to be executed only after the end of mySlot execution...

有办法吗?

【问题讨论】:

  • 信号和连接槽是否属于同一个线程中的对象?如果是这样,无论如何都会发生这种情况。如果没有,Qt 的方法不是等待,而是在连接槽的末尾发出另一个信号,这会导致其余代码运行。
  • 在这些类型的情况下,您最好使用标准回调函数,而不是调用 Qt 的信号和插槽的开销。

标签: qt signals-slots


【解决方案1】:

如果发送者和接收者在同一个线程中使用Qt::DirectConnection,如果它们在两个不同的线程中使用Qt::BlockingQueuedConnection

ClassA a;
ClassB b;
ClassC c;
c.moveToThread(aThread);
QObject::connect(&a, &ClassA::signal, &b, &ClassB::slot, Qt::DirectConnection);
QObject::connect(&a, &ClassA::signal, &c, &ClassC::slot, Qt::BlockingQueuedConnection);

请注意,如果出现以下情况,您必须断开/重新连接:

  • 发送方和接收方最终使用同一个线程,而它们以前不是,否则您将陷入死锁。
  • 发送方或接收方最终位于 2 个不同的线程中,而它们之前位于同一线程中。

如果发送者和接收者在同一个线程中,Qt::DirectConnection 也是默认值(参见 Qt::AutoConnection)。

【讨论】:

  • 我有一个单线程App,用于socket读写。每当在套接字上接收到数据时,都会在相同的函数中为 ACK 写入数据。但是,似乎很多次在插槽仍在执行期间接收到的数据。该功能尚未完成,这会导致递归层次结构稍后崩溃。有什么解决办法吗?
  • @iammilind 你应该问自己的问题。并描述“在插槽仍在执行期间收到的数据”是什么意思,不清楚
  • 请参考:Why a new signal for socket::readyRead() is served even when its earlier slot is still executing?。已从手机输入,如有任何格式错误,请见谅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2015-09-16
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多