是否会以严格的时间顺序调用 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 毫秒超时内未调用异步回调