gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:33:54 30 4
gpt4 key购买 nike

我开始研究 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(...) 的一次调用?

感谢任何帮助。谢谢。

最佳答案

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

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

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

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

关于callback - GLib - 为类的所有实例调用回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50971712/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com