2014-01-29 4 views
4

Я пытаюсь понять, что это значит, когда я звоню g_source_new. Последняя документация по API (на данный момент ее 2.38.2) on the call просто говорит:Создание нового источника в GLib

Создает новую структуру GSource. Размер указан, чтобы создать структуры, созданные из GSource, которые содержат дополнительные данные. Пропущенный размер должен быть как минимум sizeof (GSource).

Я пытаюсь понять, если применение этого API означает, что я инстанцирование нового экземпляра моей GSource или если она предназначена как регистрация нового GSource типа.

Основополагающий вопрос заключается в следующем: можно ли создать один новый GSource с использованием g_source_new, а затем применить его к любому количеству контекстов (через 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

Смежные вопросы