g_main_loop 基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<br><br>/* test.c */
int main(int argc, char const *argv[]) {
    /* 1.创建一个 GMainLoop 结构体对象,作为一个主事件循环 */
    GMainLoop *loop = g_main_loop_new(NULL, FALSE);
  
    /* 2.添加超时事件源 */
    g_timeout_add(1000, count_down, NULL);
    g_timeout_add(8000, cancel_fire, loop);
  
    /* 3.添加空闲函数,没有更高优先级事件时,空闲函数就可以被执行 */
    g_idle_add(say_idle, NULL);
  
    /* 4.循环检查事件源中是否有新事件进行分发,当某事件处理函数调用 g_main_loop_quit(),函数退出 */
    g_main_loop_run(loop);
  
    /* 5.减少loop引用计数,如果计数为0,则会释放loop资源 */
    g_main_loop_unref(loop);
  
    return 0;
}

  

复制代码
/* 
 * FALSE,该事件源将被删除
 * TRUE,该事件源会在没有更高优先级事件时,再次运行
 */
gboolean count_down(gpointer data) {
    static int count = 10;
 
    if (count < 1) {
        printf(">>> count_down() return FALSE\n");
        return FALSE;
    }
 
    printf(">>> count_down() %4d\n", count--);
    return TRUE;
}
 
gboolean cancel_fire(gpointer data) {
    GMainLoop *loop = data;
    printf(">>> cancel_fire() quit \n");
    g_main_loop_quit(loop);
 
    return FALSE;
}
 
gboolean say_idle(gpointer data) {
    printf(">>> say_idle() idle \n");
    return TRUE;
}
复制代码

gcc $(pkg-config --cflags glib-2.0) test.c $(pkg-config --libs glib-2.0) -o test

 

g_main_loop 基础用法
此案例中,我们一共添加了 3 个事件,包括 2 个超时事件源,一个空闲函数。主循环g_main_loop_run不停地检查是否有新事件发生。**各个事件源处理函数,如果返回值为 FALSE,则该事件源会被删除。如果返回值为 TRUE,则事件源一直存在
————————————————
版权声明:本文为CSDN博主「极致Linux内核」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_73494896/article/details/127011228

posted on   lydstory  阅读(471)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2019-04-04 openaml

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示