/*--------------------------------------------*/
// 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()