在建设时发出的gobject信号

时间:2015-07-26 09:13:56

标签: signals gobject

我在施工时发出信号有问题。要么我错过了信号,因为处理程序在构造时间之后连接,或者在此阶段根本不发出信号。 这是一个精简的示例,其中信号发出两次,但只注册一次:

#include <glib-object.h>

GType dummy_get_type(void);

#define DUMMY_TYPE (dummy_get_type())
#define DUMMY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), DUMMY_TYPE, Dummy))

enum {
    TEST,
    LAST_SIGNAL,
};

static guint signals[LAST_SIGNAL] = { 0 };

typedef struct {
    GObject parent;
} Dummy;

typedef struct {
    GObjectClass parent_class;
} DummyClass;

Dummy *dummy_new(void) {
    return DUMMY(g_object_new(DUMMY_TYPE, NULL));
}

void dummy_emit(Dummy *self) {
    g_signal_emit((gpointer)self, signals[TEST], 0);
}

static void dummy_init(Dummy *self) {
    dummy_emit(self);
}

static void dummy_class_init(DummyClass *klass) {
    signals[TEST] = g_signal_new("test", DUMMY_TYPE,
            G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, 0, NULL, NULL,
            g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
}

G_DEFINE_TYPE(Dummy, dummy, G_TYPE_OBJECT);

void test_callback(Dummy *dummy, gpointer user_data) {
    g_message("test emitted");
}

int main(int argc, char **argv) {
    g_type_init();

    Dummy *dummy = dummy_new();
    g_signal_connect(G_OBJECT(dummy), "test", G_CALLBACK(test_callback), NULL);

    dummy_emit(dummy);

    return 0;
}

我的问题:让这个工作的最佳做​​法是什么? 我想到了两种方式:

  1. 添加稍后发出信号的计时器或空闲处理程序。
  2. 建立启动/停止功能,以便在施工后延迟工作。

1 个答案:

答案 0 :(得分:1)

正如您所发现的,如果您没有实例,则无法连接到实例上的信号发射,并且在构造期间唯一可以访问实例的代码是类代码本身,这不需要使用信号。出于所有意图和目的,g_object_new()是一个原子操作,从调用者的角度来看。因此,在实例构建阶段,您通常不会发出信号或通知房产变更。

如果使用超时或空闲源,您还需要旋转主循环,这通常不建议用于通用对象。

通常的设计模式是在&#34; inert&#34;中创建一个实例。状态,并使用一种方法来开始广播信号和改变属性。同样的&#34;惰性&#34; state也是在dispose()虚函数实现中返回的内容。