2010-02-06 57 views
3

當我在一個線程,這是不主線程(其中gtk_main()駐留)添加許多不同的超時(每個intervall==0)...按照嚴格的時間順序調用GTK +超時回調嗎?

g_timeout_add(0, func, NULL); 

...將發生則不同func()回調在同樣的順序我叫相應g_timeout_add()的?


我問的原因是因爲GTK#內部使用超時來實現Application.Invoke()(見Application.csTimeout.cs)。


編輯:的有關巧舌如簧文件

回答

4

內部,g_timeout_add調用g_hook_insert_sorted。如果使用g_timeout_add_full,則優先級決定排序,否則該鉤子將添加到列表末尾。掛鉤按順序執行,所以當只使用g_timeout_add時,答案是肯定的。

不幸的是,並沒有明確的保證,對我而言,它看起來像一個實現細節,可能在未來發生變化。

+0

好的。但是我真的無法在* gmain.c裏找到'g_hook_insert_sorted()'的調用(我在問題中添加了一個鏈接)? – ulrichb 2010-02-10 15:28:30

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