写了一个应用g_main_loop的简单例子
g_main_loop_new,创建了一个loop对象
g_main_loop_run,当程序运行到这里,就进入了一个死循环,不过添加到loop中的逻辑还是在跑的,必须要有g_main_loop_quit()才能终止循环
main_loop中,我们可以添加异步事件,用来执行回调函数,用到g_idle_add()
guint g_idle_add (GSourceFunc function,
gpointer data
);
第一个参数 function,回调函数名
第二个参数 data,是传入函数的参数,gpointer,是一个指针,类似 void *
function挺有意思,根据返回值来确定执行次数,当返回FALSE时,就不会再被调用了,如果返回TRUE,当main_loop空闲的时候又会被执行,而且反复执行
main_loop中还可以添加定时器,超时后执行回调函数,用到 g_timeout_add
guint g_timeout_add (guint interval,
GSourceFunc function,
gpointer data
);
第一个参数 interval,超时时间,单位为 毫秒
第二个参数 function,回调函数名
第三个参数data,传入回调函数的参数
function,也是根据返回值来确定执行次数,返回FALSE时,就不会再被调用了,返回TRUE,则定时器又重新开始计时,超时后又开始调用了
idle和timeout,都可以异步调用回调函数,idle是空闲的时候调用,这个时间点不可控,而timeout,回调函数调用的时间点可控
g_main_loop_is_running就不用说了,main_loop是否在loop中,
g_main_loop_quit,当调用到它时,当前loop结束,loop中所有调用都直接return,而且g_main_loop_run结束
1 #include <stdio.h>
2 #include <glib.h>
3
4 gboolean print(gpointer data)
5 {
6 static int i = 1;
7
8 if(i > 5)
9 return FALSE;
10
11 printf("-----i=[%d]\n", i++);
12 return TRUE;
13 }
14
15 gboolean terminal(gpointer data)
16 {
17 GMainLoop *loop = data;
18
19 printf("Before Quit-----------[%d]\n", g_main_loop_is_running(loop));
20
21 g_main_loop_quit(loop);
22 }
23
24 gboolean say_hello(gpointer data)
25 {
26 printf("Hello, %s\n", data);
27 return FALSE;
28 }
29
30 gboolean say_goodbye(gpointer data)
31 {
32 printf("Goodbye, %s\n", data);
33 // return TRUE;
34 return FALSE;
35 }
36
37
38 int main(int argc, char *argv[])
39 {
40 GMainLoop *loop = g_main_loop_new(NULL, FALSE);
41
42 g_timeout_add(500, print, NULL);
43 g_timeout_add(5000, terminal, loop);
44
45 g_idle_add(say_hello, "Li Lei");
46 g_idle_add(say_goodbye, "Li Lei");
47
48 g_main_loop_run(loop);
49
50 printf("After loop------[%d]--\n", g_main_loop_is_running(loop));
51
52
53 return 0;
54 }
输出如下
[root@BC ~]#
[root@BC ~]# gcc glib_main.c -o glib_main `pkg-config --cflags --libs glib-2.0`
[root@BC ~]# ./glib_main
Hello, Li Lei
Goodbye, Li Lei
-----i=[1]
-----i=[2]
-----i=[3]
-----i=[4]
-----i=[5]
Before Quit-----------[1]
After loop------[0]--
[root@BC ~]#
当把say_goodbye中的return FALSE改成return TRUE后,会输出无数个 Goodbye,Li Lei,简直爆炸