我在施工时发出信号有问题。要么我错过了信号,因为处理程序在构造时间之后连接,或者在此阶段根本不发出信号。 这是一个精简的示例,其中信号发出两次,但只注册一次:
#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;
}
我的问题:让这个工作的最佳做法是什么? 我想到了两种方式:
答案 0 :(得分:1)
正如您所发现的,如果您没有实例,则无法连接到实例上的信号发射,并且在构造期间唯一可以访问实例的代码是类代码本身,这不需要使用信号。出于所有意图和目的,g_object_new()
是一个原子操作,从调用者的角度来看。因此,在实例构建阶段,您通常不会发出信号或通知房产变更。
如果使用超时或空闲源,您还需要旋转主循环,这通常不建议用于通用对象。
通常的设计模式是在&#34; inert&#34;中创建一个实例。状态,并使用一种方法来开始广播信号和改变属性。同样的&#34;惰性&#34; state也是在dispose()
虚函数实现中返回的内容。