glib g_main_loop的简单例子

写了一个应用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,简直爆炸

 

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值