GLib-为类的所有实例调用回调

时间:2018-06-21 14:59:26

标签: callback signals glib gobject

我开始研究Glib信号。在我的场景中,我想将一个类的多个实例连接到信号,并且如果其中一个实例调用g_signal_emit(...),则应为该类的所有实例调用提供的回调函数。让我尝试用一​​个例子来解释一下。

我尝试的是创建一个类A的两个实例(A0和A1)。 A类在其 _class_init 函数中注册了一个非常简单的信号。

 file_signals[0] = g_signal_newv("a_signal",
      G_TYPE_FROM_CLASS(ACLASS),
      G_SIGNAL_ACTION,
      NULL          /* closure */,
      NULL          /* accumulator */,
      NULL          /* accumulator data */,
      NULL          /* C marshaller */,
      G_TYPE_NONE   /* return_type */,
      0             /* n_params */,
      NULL);        /* argument types*/

然后,我将实例A0和A1的简单回调函数(cb_a)连接到信号“ a_signal”。 (例如,在 _instance_init 函数中)

g_signal_connect(A0, "a_signal", (GCallback)cb_a, NULL);
g_signal_connect(A1, "a_signal", (GCallback)cb_a, NULL); ,

其中cb_a是A.c中定义的函数:

static void cb_a(void)
{
printf("cb_a called!\");
}

现在发生的是,如果我调用

g_signal_emit(A0, file_signals[0], 0);

是仅调用与A0关联的回调。我无法弄清楚如何为A的每个实例调用函数,例如一次调用g_signal_emit(...)?

感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:3)

这不是GObject信号的工作方式。信号是从单个类实例到该类实例的所有已连接回调的一对多通知。如果要从该类的多个实例发出A::a_signal信号,则需要为每个实例调用g_signal_emit()

请注意,g_signal_emit()只能从类的实现中调用,而不能从该类之外的代码中调用。

解决问题的一种方法是在其上带有信号的单独的类(称为Signaller),将对Signaller的单个实例的引用存储在A0中和A1,并将a_cb连接到A0A1中的每个实例。要通知A类的所有实例,请在单个Signaller::a_signal实例上发出Signaller

但是,如果没有有关您要解决的特定问题的更具体的信息,很难说出正确的架构是什么。我的上述建议可能不是最合适的解决方案。