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

Mar*_*88a 2 signals gobject callback glib

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

\n\n

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

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

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

\n\n
g_signal_connect(A0, "a_signal", (GCallback)cb_a, NULL);\ng_signal_connect(A1, "a_signal", (GCallback)cb_a, NULL); ,\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 cb_a 是 Ac 中定义的函数:

\n\n
static void cb_a(void)\n{\nprintf("cb_a called!\\");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
g_signal_emit(A0, file_signals[0], 0);\n
Run Code Online (Sandbox Code Playgroud)\n\n

是仅调用与 A0 关联的回调。我无法\xc2\xb4t 弄清楚如何通过例如对 g_signal_emit(...) 的单个调用来调用 A 的每个实例的函数?

\n\n

任何帮助表示赞赏。谢谢。

\n

Phi*_*all 5

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

\n\n

请注意,这g_signal_emit()仅意味着从类的实现内部调用,而不是从该类外部的代码调用。

\n\n

解决您的问题的一种方法是拥有一个单独的类(让\xe2\x80\x99s 称之为Signaller),其上有一个信号,存储对和Signaller中单个实例的引用,并连接到每个和中的该实例。要通知该类的所有实例,请在单个实例上发出。A0A1a_cbA0A1ASignaller::a_signalSignaller

\n\n

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

\n