代码之家  ›  专栏  ›  技术社区  ›  ulrichb

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

  •  3
  • ulrichb  · 技术社区  · 16 年前

    当我添加许多不同的超时(每个 intervall==0 )在一个线程中,它是 不 主线程(其中 gtk_main() 居住。。。

    g_timeout_add(0, func, NULL);
    

    ... 那就不一样了 func() 回调发生在 同一顺序 我打了相应的电话 g_timeout_add() 是吗?


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


    编辑: 有关的glib文件是

    2 回复  |  直到 15 年前
        1
  •  4
  •   Ondergetekende    16 年前

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

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

        2
  •  0
  •   gcbenison    14 年前

    如何通过将回调显式存储在列表中,然后使用单个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);