GLib - 为 class 的所有实例调用回调
GLib - invoke callback for all instances of a class
我开始研究 Glib 信号。在我的场景中,我想将 class 的多个实例连接到一个信号,如果其中一个实例调用 g_signal_emit(...),则应为该 g_signal_emit(...) 的所有实例调用提供的回调函数=41=]。让我试着用一个例子来解释这一点。
我尝试的是创建 class A 的两个实例(A0 和 A1)。
Class 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(...)?
感谢任何帮助。谢谢。
这不是 GObject 信号的工作方式。信号是从单个 class 实例到该 class 实例的所有连接回调的一对多通知。如果您想从 class 的多个实例发出 A::a_signal
信号,您需要为每个实例调用 g_signal_emit()
。
请注意,g_signal_emit()
只能从 class 的实现中调用,而不是从 class.
之外的代码中调用
解决你的问题的一种方法是有一个单独的 class(我们称之为 Signaller
),上面有一个信号,以存储对 Signaller
的单个实例的引用在 A0
和 A1
中,并将 a_cb
连接到 A0
和 A1
中的每个实例。要通知 A
class 的所有实例,请在单个 Signaller
实例上发出 Signaller::a_signal
。
但是,如果没有关于您要解决的特定问题的更多具体信息,很难说什么是正确的架构。我上面的建议可能不是最合适的解决方案。
我开始研究 Glib 信号。在我的场景中,我想将 class 的多个实例连接到一个信号,如果其中一个实例调用 g_signal_emit(...),则应为该 g_signal_emit(...) 的所有实例调用提供的回调函数=41=]。让我试着用一个例子来解释这一点。
我尝试的是创建 class A 的两个实例(A0 和 A1)。 Class 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(...)?
感谢任何帮助。谢谢。
这不是 GObject 信号的工作方式。信号是从单个 class 实例到该 class 实例的所有连接回调的一对多通知。如果您想从 class 的多个实例发出 A::a_signal
信号,您需要为每个实例调用 g_signal_emit()
。
请注意,g_signal_emit()
只能从 class 的实现中调用,而不是从 class.
解决你的问题的一种方法是有一个单独的 class(我们称之为 Signaller
),上面有一个信号,以存储对 Signaller
的单个实例的引用在 A0
和 A1
中,并将 a_cb
连接到 A0
和 A1
中的每个实例。要通知 A
class 的所有实例,请在单个 Signaller
实例上发出 Signaller::a_signal
。
但是,如果没有关于您要解决的特定问题的更多具体信息,很难说什么是正确的架构。我上面的建议可能不是最合适的解决方案。