我正在尝试创建并发出GTK信号:
g_signal_new("child-finished",
G_TYPE_OBJECT,
G_SIGNAL_RUN_FIRST,
0,
NULL, NULL,
NULL, // *** I think this is where I need to change it
G_TYPE_NONE, 0);
g_signal_connect(G_OBJECT(myWindow), "child-finished", G_CALLBACK(MyCallback), NULL);
这是我发出信号的代码:
gtk_signal_emit_by_name(referenceToMyWindow, "child-finished");
这是我处理信号的代码:
void MyCallback(GtkWidget *w, GdkEvent *e)
{
// handler code here
}
当我运行代码时,我收到以下错误:
GLib-GObject-CRITICAL **:g
_closure_
调用:断言`closure-> marshal || closure-> meta_marshal'失败
我知道将marshaller传递给g_signal_new
函数有什么关系,但我不知道marshaller是什么,我无法理解the documentation,而且网上的例子是很少和很远。如何声明和连接我自己的信号?
答案 0 :(得分:3)
GObject库提供了一些builtin marshallers,因此您的代码应该是:
g_signal_new("child-finished",
G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
0, NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1, G_TYPE_POINTER);
或者,如果你想要进行类型检查:
g_signal_new("child-finished",
G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
0, NULL, NULL,
g_cclosure_marshal_VOID__BOXED,
G_TYPE_NONE, 1, GDK_TYPE_EVENT);
信号处理程序的参数必须存在(对象本身是隐含的),所以一定要指定一个指针(如第一个例子中所示)或一个盒装类型(如第二个)例子)。
如果您需要的编组器不在内置编组器中,您可以使用glib-genmarshal实用程序或直接自己编写代码(这非常简单,只需检查glib-genmarshal的输出)。