GLib超时内存管理

GLib timeout memory management

我有一个 GLib.timeout_add_seconds() 计时器,我偶尔会更新超时间隔,如下所示:

self.timer_id = GLib.timeout_add_seconds(interval, self.on_timeout, user_data)
...
def on_timeout(self, user_data):
    ...
    if change_timeout_interval:
        self.timer_id = GLib.timeout_add_seconds(new_interval, self.on_timeout, user_data)
        return False
    ...

因此,新计时器的 ID 存储在相同的 self.timer_id 变量中,当我从回调中 return false 时,旧计时器被删除(?)。正如 here 所讨论的,我担心内存管理,尤其是因为我将 user_data 变量传递给回调函数。我只使用 GLib.source_remove() 来删除“最终”计时器 ID,而不是如上所示在回调函数中替换的所有先前的计时器 ID。这很糟糕吗?如果是这样,我该如何避免这种情况?

我觉得不错。当你用新的定时器 ID 覆盖 self.timer_id 时,旧的定时器 ID 最终会通过返回 False.

被删除(并且不会再次发送)

您是否看到任何问题的征兆,例如计时器被多次调度,或 valgrind --tool=memcheck 显示泄漏?

一个小提示:您可以使用 return GLib.SOURCE_REMOVE 而不是 return False 以使代码更清晰一些。他们是等价的。相反是 return GLib.SOURCE_CONTINUE 而不是 return True.