当我在一个帖子中添加许多不同的超时(每个intervall==0
)时,不主线程(gtk_main()
所在的位置)......
g_timeout_add(0, func, NULL);
...那么不同的func()
回调会出现在相同的顺序中我调用了相应的g_timeout_add()
?
我问的原因是因为GTK#正在使用内部超时来实现Application.Invoke()
(请参阅Application.cs和Timeout.cs)。
编辑:有关的glib文件是
答案 0 :(得分:4)
在内部,g_timeout_add调用g_hook_insert_sorted。如果使用g_timeout_add_full,则优先级确定排序,否则在列表的末尾添加钩子。钩子按顺序执行,所以当只使用g_timeout_add时,答案是肯定的。
不幸的是,没有明确的保证,对我而言,它看起来像是一个可能在未来发生变化的实施细节。
答案 1 :(得分:0)
如何通过在列表中显式存储回调来强制执行调用顺序,然后使用单个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);