【问题标题】:How can I maintain, atleast, some order in which callbacks connect to a signal?至少,我如何维护回调连接到信号的某种顺序?
【发布时间】:2017-06-25 00:42:07
【问题描述】:

当我简单地使用“连接”时,我无法指定回调中的顺序将被调用。在默认值之前/之后连接 connect_before 和 connect_after 不符合我的目的。我想要 connect_first 和 connect_last 之类的东西,或者其他任何可以帮助我指定回调连接到信号的顺序的东西。

这样的?

    something.connect_first('my-signal', callback1)
    somethingelse.connect_last('my-signal', callback2)

【问题讨论】:

  • 异步任务是异步的。如果您想订购它们,请等到其他一些完成或失败之后再启动它们。
  • 你会如何处理调用connect_last,然后在另一段代码中再次调用它的情况?只有一个处理程序可以放在最后。解决您的问题的一种方法是只与一个事件建立一个连接,并在该处理程序中按特定顺序执行几件事。
  • GObject 信号不是异步的:它们是完全同步的。控制流将阻塞直到g_signal_emit() 返回。

标签: python pygobject gobject


【解决方案1】:

GObject 信号只有一个明确的顺序保证:

  • 使用G_SIGNAL_RUN_FIRST 创建新信号时添加的类闭包将在使用g_signal_connect() 添加的所有回调之前调用
  • 在创建新信号G_SIGNAL_RUN_LAST 时添加的类闭包将在使用g_signal_connect() 添加的所有回调之后和使用g_signal_connect_after() 添加的所有回调之前调用

这意味着当您创建新信号时,您只能控制是否在所有其他手动连接的回调之前或之后调用回调 - 原因很明显,因为您可能希望在开始时提供初始状态发射链,或者你想确保发射链末端的稳定状态。

至于使用g_signal_connect() 添加的回调的顺序,没有任何顺序的明确保证。但是,有一个隐含的顺序,即连接顺序,它可能永远不会改变。请记住,信号处理程序可以安装新的处理程序,或断开它们,或阻止信号发射,因此依赖特定顺序通常表明代码中存在设计问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    相关资源
    最近更新 更多