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

时间:2010-02-06 15:00:25

标签: c# c++ multithreading gtk gtk#

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

g_timeout_add(0, func, NULL);

...那么不同的func()回调会出现在相同的顺序中我调用了相应的g_timeout_add()


我问的原因是因为GTK#正在使用内部超时来实现Application.Invoke()(请参阅Application.csTimeout.cs)。


编辑:有关的glib文件是

2 个答案:

答案 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);