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.
小结