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,简直爆炸
glib g_main_loop的简单例子相关推荐
- webpack入门之简单例子跑起来
webpack入门之简单例子跑起来 webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载 ...
- 图片上传(加水印、缩略图、远程保存)的简单例子
图片上传(加水印.缩略图.远程保存)的简单例子(应用于51aspx.com) 该源码下载地址:http://51aspx.com/CV/ImageUpload 今天看到xiongeee发的文章使用使用 ...
- java hashtable import,Hashtable的一个简单例子
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下是关于Hashtable的简单例子,谁知道别的遍历Hashtable的方法,请回复! package no1; import java.util.En ...
- SAP MM采购定价过程的一个简单例子
SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...
- .net中使用反射的简单例子
说明:由于工作原因,本人使用反射的机会不是很多,所以没有必要为了炫耀技术而使用这种技术,不过今天有人问到这方面的问题,所以做了一个简单例子,供初学者参考,代码如下: using System; usi ...
- linux下Makefile中包含有shared library动态链接库文件时候的简单例子
如果不知道什么是makefile,可以首先看我的另一篇博客: linux下Makefile的简单例子及解释 http://www.cnblogs.com/lihaozy/archive/2012/08 ...
- java 国际化例子_JavaSE 国际化 简单例子
①在src下添加两个文件: base_zh_CN.properties Test=\u8fd9\u662f\u4e2d\u6587 base_en_US.properties Test=english ...
- 6翻了C语言,《嗨翻C语言》随书练习六 6章 二叉树简单例子
二叉树简单例子/* <嗨翻C语言>随书练习 6章 2016-12-06 xiousheng@126.com 二叉树例子,警务罪犯判断档案系统,哈哈 书中可以专家系统例子 */ #i ...
- QT 信号与槽 最简单例子
QT 信号与槽 最简单例子 main.cpp 和 my_head.h源码: [cpp] view plaincopy #ifndef MY_HEAD_H #define MY_HEAD_H #inc ...
最新文章
- centos 6.8 x86_64下autoconf版本升级到2.69
- 报名 | 飞速发展的个人消费信贷与风险控制讲座
- ios 设置属性的center_IOS开发-常用UI控件的基本使用(Transform形变属性、frame属性、center属性的使用)...
- 云现场 | 为什么说边缘计算是5G时代的必备品?
- 作者:黄伟(1964-),男,博士,西安交通大学管理学院教授、博士生导师、院长...
- SAP License:利用MM的预留功能进行生产控制
- 《计算机操作系统》(慕课版) 第1章 操作系统引论
- 计算机基础知识ppt操作题,计算机一级ppt操作题
- 【高效开发插件】06 FEHelper 数据格式化
- 思科模拟器CIsco Packet Tracer路由器上配置 DHCP
- 根据工资计算税费html,税后工资计算器2018 个人所得税excel计算公式
- 智能电动自行车充电桩系统解决方案
- 求两个数最小公倍数的7种方法
- N-BEATS NEURAL BASIS EXPANSION ANALYSIS FOR INTERPRETABLE TIME SERIES FORECASTING
- 关于spyder环境配置
- urp SpotLight 衰减方式扩展
- 第八届蓝桥杯 拉马车JAVA暴解
- Win10 x64 中VC6 安装卡死、无法单步调试、调试退出进程没有结束
- 如何获取Flickr图片链接地址作为外链图片
- Numpy基础知识(摘录笔记)