【发布时间】:2018-11-01 06:14:56
【问题描述】:
我正在处理一个应用程序,其中许多信号被触发,然后重新连接。我将详细解释该应用程序是如何工作的,以及我的困惑从哪里开始。
1。重新连接信号
在我的应用程序中,我经常重新连接信号。为此,我将使用以下静态函数,取自这篇文章中@ekhumoro 的答案(并稍作修改):PyQt Widget connect() and disconnect()
def reconnect(signal, newhandler):
while True:
try:
signal.disconnect()
except TypeError:
break
if newhandler is not None:
signal.connect(newhandler)
2。应用程序
想象函数emitterFunc(self) 循环遍历对象列表。在每次迭代中,该函数将mySignal 连接到一个对象,触发信号,然后在下一个迭代步骤开始时再次断开mySignal。发射的信号还携带一些有效载荷,例如对象Foo()。
编辑:
上面显示的设计简化了很多。在最终的设计中,信号发射器和接收槽可能在不同的线程中运行。
由于会导致我们误入歧途的原因,我不能一次连接所有对象,发出信号,最后断开所有对象。我必须一个接一个地循环,执行连接-发射-断开过程。
再一次,由于可能导致我们太过分的原因,我不能直接调用这些插槽。
3。 Signal-Slot 机制的心理形象
随着时间的推移,我对信号槽机制的工作原理有了一个心理印象。我想象一个 Signal-Slot 引擎 吸收所有发射的信号并将它们放入队列中。每个信号都在等待轮到它。当时间准备好时,引擎将给定的信号传递给适当的处理程序。为了正确地做到这一点,引擎有一些“簿记”工作,以确保每个信号最终都在正确的插槽中。
4。 Signal-Slot 引擎的行为
假设我们处于第 nth 次迭代步骤。我们将self.mySignal 连接到object_n。然后我们用它的有效载荷发射信号。几乎在这样做之后,我们立即断开连接并建立到 object_n+1 的新连接。在我们断开连接的那一刻,触发的信号可能还没有完成它的工作。我可以想象 Signal-Slot 引擎的三种可能行为:
[选项 1] 引擎注意到连接已断开,并从其队列中丢弃
sig_n。[OPTION 2] 引擎注意到与另一个处理程序的连接重新建立,并将
sig_n发送到 object_n+1 的处理程序(一旦它到达队列的前面)。[选项 3] 引擎不会更改
sig_n的任何内容。当被触发时,它是为 object_n 的处理程序而设计的,这就是它的结束位置。
5。我的问题
我的第一个问题现在已经很明显了。什么是正确的信号槽引擎行为?我希望这是第三种选择。
作为第二个问题,我想知道给定的心理形象在多大程度上是正确的。例如,我可以依靠信号按顺序从队列中出来吗?这个问题不太重要——它对我的申请当然不是至关重要的。
第三个问题与时间效率有关。重新连接到另一个处理程序是否耗时?一旦我知道第一个问题的答案,我将继续构建应用程序,我可以自己测量重新连接时间。所以这个问题不是那么重要。但如果你知道答案,请分享:-)
【问题讨论】:
标签: qt pyqt qt5 pyqt5 signals-slots