g_main_loop_run 的简单使用举例

本文详细介绍了如何在C语言中使用Glib库的g_main_loop_run函数来实现事件驱动程序,通过添加timeout和idle事件源,并提供了相应的回调函数示例。
摘要由CSDN通过智能技术生成
/*--------------------------------------------*/
// author: hjjdebug
// date: 2024年 04月 23日 星期二 16:52:40 CST
// description: g_main_loop_run 的简单使用举例
/*--------------------------------------------*/


#include <glib.h>
// glib.h 包含了glib目录下的很多头文件,但唯独没有加 glib/gstdio.h 和 glib/gprintf.h
// 所以为了使用g_printf, 可以添加glib/gstdio.h(包含后者) 或 glib/gprintf.h
// 经查g_print 与 g_printf功能一致,也带format, 所以可以不用g_printf了
//#include <glib/gprintf.h> 
/*---------- 事件发生后的回调函数 begin -----------*/
static gboolean quit_loop (gpointer data)
{
	GMainLoop *loop = (GMainLoop *)data;

	g_print("fun:%s()\n", __func__);
	g_main_loop_quit(loop);

	return G_SOURCE_REMOVE;
}

static gboolean gsource_func1 (gpointer user_data)
{
	(void) user_data;
    g_print ("fun:%s()\n", __func__);
    gint64 result=g_get_real_time();
    g_print ("%ld s\n", result/1000000); //取秒值即可
    return TRUE; //true 是 G_SOURCE_CONTINUE, 条件满足会继续调用该函数
}
 
static gboolean gsource_idle_func (gpointer user_data)
{
	(void) user_data;
    g_print ("fun:%s()\n", __func__);
 
    return FALSE; //只调用一次就over
}
/*---------- 事件发生后的回调函数 end -----------*/
 
//练一练,跟一跟也就熟悉了!!最好跟到循环里,也许下一次要写 g_main_loop_run的代码分析了.
int main(void)
{
	g_print("Hello, world!\n");
	GMainLoop *loop = g_main_loop_new (NULL, FALSE); // 创建对象GMainLoop
//向loop对象 添加一个timeout事件,回调函数quit_loop
//例如文件描述符(普通文件,管道或套接字)和超时。 
	g_timeout_add(6000, (GSourceFunc)quit_loop, loop); 
// 还可以使用g_source_attach()添加新类型的事件源。
	GSource *source = g_timeout_source_new(1000); //参数是ms值
	guint source_id = g_source_attach(source,NULL);
	g_print("source_id:%d\n",source_id);
	g_source_set_callback(source, gsource_func1,NULL,NULL);
// 添加一个idle 事件
	g_idle_add(gsource_idle_func, NULL);
// 进入事件循环,主事件循环管理GLib和GTK+应用程序的所有可用事件源。
	g_main_loop_run (loop);  
	g_main_loop_unref (loop); //循环退出后释放内存
	return 0;
}

编译时记着加上包含头文件路径和库路径

INCLUDEPATH += /usr/include/glib-2.0 /usr/lib/x86_64-linux-gnu/glib-2.0/include
LIBS += -lglib-2.0
 


运行结果:

$ ./gMainLoop 
Hello, world!
source_id:2
fun:gsource_idle_func()
fun:gsource_func1()
1713862924 s
fun:gsource_func1()
1713862925 s
fun:gsource_func1()
1713862926 s
fun:gsource_func1()
1713862927 s
fun:gsource_func1()
1713862928 s
fun:quit_loop()

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值