gpt4 book ai didi

qt - 在槽执行期间断开所有信号槽连接是否会阻止所有后续槽被调用?

转载 作者:行者123 更新时间:2023-12-04 12:48:36 25 4
gpt4 key购买 nike

假设我有一个 Qt 应用程序,其中有如下内容:

connect(A, SIGNAL(a()), B, SLOT(b1()));
connect(A, SIGNAL(a()), B, SLOT(b2()));
...
void B::b1() {
A->disconnect();
}

a()发出后,插槽 B::b2()B::b1() 中从 A 断开所有插槽后仍然会被调用,因为它们都响应相同的信号?假设两个对象都生活在同一个线程中,所以我们有一个直接的连接。

我知道 disconnect()从 A 断开所有信号连接,但我不确定发射是否只是调度 b1 和 b2 插槽被调用,然后调用它们,以便对连接的更改在两个插槽之前无效(因此发射) 返回。所以它可以实现如下:
emit:
make temprorary copy of signal's slot table
foreach element in temporary slot table: call

disconnect:
clear signal's slot table

否则,您可能会遇到数据结构完整性问题。

最佳答案

一个快速的实验表明第二个插槽没有被调用。

但是,我不确定这是否是 Qt 所 promise 的。

Qt 确实记录了在连接接收器的迭代期间进行了某些检查,但它非常松散且不具体(而且我在我的简短搜索中没有遇到任何更好的东西);来自 http://doc.qt.io/qt-5/signalsandslots.html :

This is the overhead required to locate the connection object, to safely iterate over all connections (i.e. checking that subsequent receivers have not been destroyed during the emission)



因此,他们松散地记录了在发出信号时进行了某些检查,例如接收器是否已被破坏。我认为检查连接是否已断开似乎是一种类似的情况,但如果明确记录下来会很好。

由于听起来这对您来说是个问题(您希望所有信号都通过,对吗?),您可以通过确保信号到槽 b1() 来解决这个问题。最后连接。 Qt 确实 promise 插槽将按连接顺序由信号调用,因此如果您将断开连接的插槽安排为最后一个,则将看到所有其他插槽。

我不知道这有多么容易安排,但一个对象将所有内容与另一个对象的槽函数内部断开连接似乎也有点奇怪(所以可能还有其他一些重构可以解决这个问题)。

如果这些都不能接受,那么为 A 想出一个代理对象并不会太难。的信号具有您需要的行为。会有一个:
connect(A, SIGNAL(a()), proxy_obj, SLOT(proxy_slot()));

将 A 的信号连接到代理,然后 B可以连接到代理的信号(当代理的插槽被调用时代理将发出):
connect(proxy_obj, SIGNAL(a()), B, SLOT(b1()));
connect(proxy_obj, SIGNAL(a()), B, SLOT(b2()));

由于 A 的断开连接不会影响代理与 B 的连接,代理将确保当信号 A->a() 时 B 的所有槽都被调用。被发射。
class A_proxy : public QObject
{
Q_OBJECT
public slots:
void proxy_slot() {
emit a();
}

signals:
void a();
};

关于qt - 在槽执行期间断开所有信号槽连接是否会阻止所有后续槽被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5992483/

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