gpt4 book ai didi

qt - Qt::QueuedConnection 的问题,断开连接后传递的信号

转载 作者:行者123 更新时间:2023-12-04 14:20:39 26 4
gpt4 key购买 nike

我刚刚在 Qt 4.6 中发现了队列连接的有趣行为:

建立第一个排队连接:

connect(someSender, SIGNAL(completed()), this, SLOT(handleCompletion()), Qt::QueuedConnection)

然后 someSender 发送信号:
emit completed()

在接收信号之前(因为它在队列中),我断开信号:
disconnect(someSender, SIGNAL(completed()), this, SLOT(handleCompletion())

尽管如此,handleCompletion 插槽仍会在下一次 eventloop 迭代中被调用。我可以通过在正确的位置使用 someSender->blockSignals(true) 来防止这种情况发生,但更不用说使用一些 bool 标志来禁用插槽的功能了。

特别是,我感到惊讶的是,Qt 文档中没有提到这种行为(至少我还没有找到)。

最后的问题是:有什么明智的方法可以避免这种情况发生?

最佳答案

我认为 Qt 以最直观的方式表现。

当你这样做 emit completed() ,信号立即激活或排队所有连接的插槽是有意义的。如果排队的插槽可能由于断开连接而取消排队,则将更难以理解,并且更容易出现竞争条件。另外,考虑更复杂的场景:例如因此,如果断开连接将其从队列中删除,重新连接是否会将其放回原处?

如果它按您预期的方式工作,那么代替这个问题的是“Qt::QueuedConnection 的问题,断开连接后未传递信号”。

至于避免这种情况的明智方法:您应该重新设计代码,以便发送者和接收者都不必关心信号是直接连接还是排队。我建议发送者和接收者都不要调用 QObject::connect这是由第三类完成的。目前尚不清楚这是否会完全解决您的问题,这取决于您在哪里以及为什么要执行 disconnect .

关于qt - Qt::QueuedConnection 的问题,断开连接后传递的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2532341/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com