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
.
我有一个 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
.