【问题标题】:GLib - invoke callback for all instances of a classGLib - 为类的所有实例调用回调
【发布时间】:2018-06-21 14:59:25
【问题描述】:

我开始研究 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(...)?

感谢任何帮助。谢谢。

【问题讨论】:

    标签: callback signals glib gobject


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢你,菲利普,我会考虑你对“Signaller”课程的建议。我实际上想要实现的是实例化类 A 的几个实例,这些实例包含我想向其传递消息的函数(例如 void cb_a(parameters, message))。当我发出信号时,此消息应作为有效负载出现。所有实例的所有 cb_a 函数都应该接收消息并解析它。然后消息的内容将允许实例决定是否将消息发送给他们,或者他们是否应该忽略该内容。
    • 我添加了信号器类,它就像一个魅力。谢谢!
    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2023-03-04
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多