在 GLib 中创建一个新的 GSource

pku*_*rby 5 c glib

当我打电话时,我试图理解这意味着什么g_source_new通话中的最新 API 文档(此时是 2.38.2)只是说:

创建一个新的 GSource 结构。指定大小以允许创建从包含附加数据的 GSource 派生的结构。传入的大小必须至少为 sizeof (GSource)。

我试图了解调用此 API 是否意味着我正在实例化我的新实例,GSource或者它是否旨在作为新GSource类型的注册。

潜在的问题是:我是否允许创建一个新的GSourceusingg_source_new然后将其应用于任意数量的上下文(通过g_source_attach)?或者即使在尝试将GSource我定义的相同功能应用于多个上下文时,我也必须同时使用这两个功能吗?

dra*_*hnr 5

从源定义看来,您只能将 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