当我打电话时,我试图理解这意味着什么g_source_new。通话中的最新 API 文档(此时是 2.38.2)只是说:
创建一个新的 GSource 结构。指定大小以允许创建从包含附加数据的 GSource 派生的结构。传入的大小必须至少为 sizeof (GSource)。
我试图了解调用此 API 是否意味着我正在实例化我的新实例,GSource或者它是否旨在作为新GSource类型的注册。
潜在的问题是:我是否允许创建一个新的GSourceusingg_source_new然后将其应用于任意数量的上下文(通过g_source_attach)?或者即使在尝试将GSource我定义的相同功能应用于多个上下文时,我也必须同时使用这两个功能吗?
从源定义看来,您只能将 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;
};
Run Code Online (Sandbox Code Playgroud)
看一下
static guint
g_source_attach_unlocked (GSource *source,
GMainContext *context,
gboolean do_wakeup)
Run Code Online (Sandbox Code Playgroud)
这将告诉您只有关联的GMainContext才会被唤醒。
派生GSource用法示例:https : //github.com/chergert/iris/blob/master/iris/iris-gsource.c