glib如何实现计时器功能

本文介绍了如何使用Glib库中的g_timeout_add和g_timeout_add_seconds函数创建计时器,通过回调函数在指定时间间隔执行任务,并通过GMainLoop管理事件循环。示例中详细展示了计时器的工作原理和如何控制其生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

glib 提供了一种方便的方式来创建计时器,主要通过 g_timeout_add()  和   g_timeout_add_seconds() 函数来实现。这些函数可以让你设置一个回调函数,该函数将在指定的时间间隔后被调用。这种方式非常适合用于实现计时器或者定期执行某个任务。

下面是一个简单的例子,展示了如何使用 g_timeout_add() 来创建一个每500毫秒触发一次的计时器

 测试代码:

#include <glib.h>  
#include <stdio.h>  
  
int timer_count = 0;
// 这是计时器回调函数  
gboolean timer_callback(gpointer user_data) { 
    GMainLoop * loop = user_data;
    timer_count++;
    printf("Timer fired! %d \n",timer_count);  
    // 返回 TRUE 以保持计时器活动,或者返回 FALSE 以停止它
    
    if(timer_count == 10){
      g_main_loop_quit(loop);
      return FALSE;
    }  
    return TRUE;  
}  
  
int glib_timer_test(void) {  
    // 初始化 GLib 的主事件循环  
    GMainLoop *loop = g_main_loop_new(NULL, FALSE);  
  
    // 设置一个每 500 毫秒触发一次的计时器  
    // 第一个参数是超时时间(以毫秒为单位),第二个参数是回调函数,第三个参数是传递给回调的用户数据  
    guint timer_id = g_timeout_add(500, timer_callback, loop);  
  
    printf("enter main loop\n");
    // 开始主事件循环  
    g_main_loop_run(loop);  
    printf("main loop quit \n");
  
    // 在实际应用中,你可能需要在某个条件满足时停止事件循环  
    // 例如,你可以在回调函数中判断某个条件,并在条件满足时返回 FALSE  
    // 并在这里调用 g_main_loop_quit(loop) 来停止事件循环  
  
    // 清理资源  
    g_source_remove(timer_id); // 停止并移除计时器  
    g_main_loop_unref(loop); // 释放主事件循环  
  
    return 0;  
}

在这个例子中,timer_callback 函数将每500毫秒被调用一次,因为它是由 g_timeout_add() 设置的计时器回调函数。如果你想让计时器只触发一次而不是周期性触发,你可以在回调函数中返回 FALSE

请注意,g_main_loop_run() 会阻塞当前线程,直到主事件循环被停止。在实际应用中,你可能会根据某些条件来停止事件循环,例如用户输入、某个特定事件的发生等。在本实例中,使用timer_count计数的方式,数到10退出主循环。

此外,g_timeout_add_seconds() 函数与 g_timeout_add() 类似,但它是以秒为单位设置超时时间,而不是毫秒。这可以用于那些不需要高精度计时的场景。

测试结果:

这个地方会报一个错误:主要是因为我们在timer_count 的值是10时,返回了FALSE。此时定时器相关资源会自动被停止和删除。所以后面就不需要执行g_source_remove了,将g_source_remove函数注释掉,或者timer_count函数到10时,依然返回TRUE.

 

小结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值