基本使用
- signal_demo.h
#ifndef SIGNAL_DEMO_H
#define SIGNAL_DEMO_H
#include <glib-object.h>
#define SIGNAL_TYPE_DEMO (signal_demo_get_type ())
#define SIGNAL_DEMO(object) \
G_TYPE_CHECK_INSTANCE_CAST ((object), SIGNAL_TYPE_DEMO, SignalDemo)
#define SIGNAL_IS_DEMO(object) \
G_TYPE_CHECK_INSTANCE_TYPE ((object), SIGNAL_TYPE_DEMO))
#define SIGNAL_DEMO_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), SIGNAL_TYPE_DEMO, SignalDemoClass))
#define SIGNAL_IS_DEMO_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), SIGNAL_TYPE_DEMO))
#define SIGNAL_DEMO_GET_CLASS(object) (\
G_TYPE_INSTANCE_GET_CLASS ((object), SIGNAL_TYPE_DEMO, SignalDemoClass))
typedef struct _SignalDemo SignalDemo;
struct _SignalDemo {
GObject parent;
};
typedef struct _SignalDemoClass SignalDemoClass;
struct _SignalDemoClass {
GObjectClass parent_class;
void (*default_handler) (gpointer instance, const gchar *buffer, gpointer userdata);
};
GType signal_demo_get_type (void);
#endif
- signal_demo.c
#include "signal_demo.h"
G_DEFINE_TYPE (SignalDemo, signal_demo, G_TYPE_OBJECT);
static void
signal_demo_default_handler (gpointer instance, const gchar *buffer, gpointer userdata)
{
g_print ("Default handler said: %s\n", buffer);
}
void
signal_demo_init (SignalDemo *self)
{
}
void
signal_demo_class_init (SignalDemoClass *klass)
{
klass->default_handler = signal_demo_default_handler;
g_signal_new("hello", /*信号名字*/
G_TYPE_FROM_CLASS(klass), /*类型ID,(1)G_TYPE_FROM_CLASS获取; (2) 直接使用 SIGNAL_TYPE_DEMO 宏 */
G_SIGNAL_RUN_FIRST, /*信号的调用顺序*/
G_STRUCT_OFFSET(SignalDemoClass, default_handler), /*内存偏移量,为了找到default handler的位置*/
NULL,
NULL,
g_cclosure_marshal_VOID__STRING,/*闭包,marshal函数的描述*/
G_TYPE_NONE, /*marshal函数的返回值类型*/
1, /*g_signal_new 函数向 marshal 函数传递的参数个数*/
G_TYPE_STRING); /*g_signal_new 函数向 marshal 函数传递的参数类型*/
}
- main.c
#include <stdio.h>
#include "signal_demo.h"
static void
my_signal_handler (gpointer *instance, gchar *buffer, gpointer userdata)
{
g_print ("my_signal_handler said: %s\n", buffer);
g_print ("my_signal_handler said: %s\n", (gchar *)userdata);
}
int main()
{
// g_type_init ();
gchar *userdata = "This is userdata";
SignalDemo *sd_obj = g_object_new (SIGNAL_TYPE_DEMO, NULL);
/* 信号连接 */
g_signal_connect (sd_obj, "hello",
G_CALLBACK (my_signal_handler),
userdata);
/* 发射信号 */
g_signal_emit_by_name (sd_obj,
"hello",
"This is the second param",
G_TYPE_NONE);
// HOME_CLASS(pHome).
while(1);
return 0;
}
进阶使用
暂时没遇到,先空这里