2014-01-29 39 views
4

我試圖瞭解當我撥打g_source_new時這意味着什麼。最新的API文檔(此時其2.38.2)on the call只是說:在GLib中創建新的GSource

創建一個新的GSource結構。指定的大小允許創建從GSource派生的包含附加數據的結構。傳入的大小必須至少爲sizeof(GSource)。

我想明白,如果調用此API意味着我的實例我GSource一個新的實例,或者如果它要提出一個新GSource類型的註冊。

潛在問題是:我允許使用g_source_new創建一個新的GSource,然後將其應用於任意數量的上下文(通過g_source_attach)?或者,即使試圖將我定義的多個上下文應用到相同的GSource,我是否也必須使用這兩種功能?

回答

4

從源定義,它看起來像您可以附加GSource只有一個GMainContext

struct _GSource 
{ 
    /*<private>*/ 
    gpointer callback_data; 
    GSourceCallbackFuncs *callback_funcs; 

    const GSourceFuncs *source_funcs; 
    guint ref_count; 

    GMainContext *context; // <<<<< 

    gint priority; 
    guint flags; 
    guint source_id; 

    GSList *poll_fds; 

    GSource *prev; 
    GSource *next; 

    char *name; 

    GSourcePrivate *priv; 
}; 

看一看

static guint 
g_source_attach_unlocked (GSource  *source, 
         GMainContext *context, 
         gboolean  do_wakeup) 

它會告訴你,只有相關聯的GMainContext將被喚醒。衍生GSource用法

實施例:https://github.com/chergert/iris/blob/master/iris/iris-gsource.c

+1

優異點。這非常明確。每個上下文調用一次g_source_new。謝謝 – pkurby