【发布时间】:2015-10-16 14:13:05
【问题描述】:
我在施工时发出信号时遇到问题。要么我错过了信号,因为处理程序是在构造时间之后连接的,要么在这个阶段根本没有发出信号。 这是一个简化的示例,其中一个信号被发射了两次,但只注册了一次:
#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;
}
我的问题:实现此功能的最佳做法是什么? 我想到了两种方法:
- 添加稍后发出信号的计时器或空闲处理程序。
- 建立启动/停止功能以延迟构建时间之后的服务。
【问题讨论】: