是否会以严格的时间顺序调用 GTK+ 超时回调?

Posted

技术标签:

【中文标题】是否会以严格的时间顺序调用 GTK+ 超时回调?【英文标题】:Will the GTK+ timeout callbacks be called in strict time order? 【发布时间】:2010-02-06 15:00:25 【问题描述】:

当我在一个线程中添加许多不同的超时(每个intervall==0)时,这不是主线程(gtk_main() 所在的位置)...

g_timeout_add(0, func, NULL);

...那么不同的func() 回调是否会以相同的顺序我调用相应的g_timeout_add() 发生?

我问的原因是因为 GTK# 使用内部超时来实现 Application.Invoke()(参见 Application.cs 和 Timeout.cs)。

编辑:相关的 glib 文件是

http://git.gnome.org/browse/glib/tree/glib/gmain.c http://git.gnome.org/browse/glib/tree/glib/ghook.c

【问题讨论】:

【参考方案1】:

在内部,g_timeout_add 调用g_hook_insert_sorted。如果使用g_timeout_add_full,则优先级确定排序,否则将钩子添加到列表末尾。 Hooks 是按顺序执行的,所以当只使用 g_timeout_add 时,答案是肯定的。

不幸的是,没有明确的保证,对我来说,这看起来像是一个未来可能会改变的实现细节。

【讨论】:

好的。但是我在 gmain.c 中真的找不到对g_hook_insert_sorted() 的调用(我在问题中添加了一个链接)?【参考方案2】:

如何通过将回调显式存储在列表中来强制执行调用顺序,然后使用单个 g_timeout_add() 调用迭代该列表的函数?

static gboolean
call_in_order (GList* callbacks)

  for (; callbacks != NULL; callbacks = callbacks->next)
    
      g_assert (callbacks->data != NULL);
      GSourceFunc callback = (GSourceFunc)(callbacks->data);

      callback(NULL);
    



...

 GList *callbacks = NULL;
 callbacks = g_list_append(callbacks, func1);
 callbacks = g_list_append(callbacks, func2);
 callbacks = g_list_append(callbacks, func3);
 callbacks = g_list_append(callbacks, func4);

 g_timeout_add(0, (GSourceFunc)call_in_order, callbacks);

【讨论】:

以上是关于是否会以严格的时间顺序调用 GTK+ 超时回调?的主要内容,如果未能解决你的问题,请参考以下文章

HOWTO:使用 gtk (rust-gnome) 回调的惯用 Rust

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

带有 Typescript 错误的玩笑:超时 - 在 jest.setTimeout.Timeout 指定的 5000 毫秒超时内未调用异步回调

使用 Node 进行 Jest 测试 - 超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

jasmine:在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时时间内未调用异步回调