GTK 2.0 定时器的启动和销毁停止
在 GTK 2.0 中,定时器功能主要通过 g_timeout_add() 系列函数实现。以下是关于 GTK 2.0 定时器的详细使用方法:
启动定时器
基本定时器
interval: 定时器间隔,单位毫秒function: 回调函数,返回 gboolean (TRUE 表示继续,FALSE 表示停止)data: 传递给回调函数的数据
示例:
#include <gtk/gtk.h>
gboolean timeout_callback(gpointer data) {
static int count = 0;
g_print("定时器触发: %d\n", ++count);
return TRUE; // 返回 TRUE 保持定时器运行
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// 创建定时器,每1000毫秒(1秒)触发一次
guint timer_id = g_timeout_add(1000, timeout_callback, NULL);
gtk_main();
return 0;
}带优先级的定时器
guint g_timeout_add_full(gint priority, guint interval,
GSourceFunc function, gpointer data,
GDestroyNotify notify);priority: 定时器优先级 (G_PRIORITY_DEFAULT 等)notify: 定时器销毁时的清理函数
停止定时器
要停止定时器,可以使用 g_source_remove() 函数:
tag:g_timeout_add()返回的定时器ID
示例:
#include <gtk/gtk.h>
guint timer_id;
gint count = 0;
gboolean timeout_callback(gpointer data) {
g_print("定时器触发: %d\n", ++count);
if (count >= 5) {
g_print("已达到5次,停止定时器\n");
g_source_remove(timer_id); // 停止定时器
return FALSE;
}
return TRUE;
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// 创建定时器,每500毫秒触发一次
timer_id = g_timeout_add(500, timeout_callback, NULL);
gtk_main();
return 0;
}定时器销毁时的清理
如果需要定时器被移除时执行清理操作,可以使用 g_timeout_add_full() 并指定 notify 函数:
#include <gtk/gtk.h>
void timer_cleanup(gpointer data) {
g_print("定时器已被移除,执行清理\n");
}
gboolean timeout_callback(gpointer data) {
static int count = 0;
g_print("定时器触发: %d\n", ++count);
if (count >= 3) {
g_print("已达到3次,停止定时器\n");
return FALSE; // 返回FALSE会自动移除定时器并调用清理函数
}
return TRUE;
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// 创建带清理函数的定时器
guint timer_id = g_timeout_add_full(G_PRIORITY_DEFAULT,
800,
timeout_callback,
NULL,
timer_cleanup);
gtk_main();
return 0;
}注意事项
- 定时器回调函数在主事件循环中执行,不应执行耗时操作
- 回调函数返回 FALSE 会自动移除定时器
- 使用
g_source_remove()可以手动移除定时器 - 定时器精度不是绝对精确,受系统负载影响
- 在 GTK 主循环 (
gtk_main()) 运行前添加的定时器也会生效
以上就是在 GTK 2.0 中使用定时器的主要方法。
补充,定时器回调函数返回true是循环定时器,返回false是一次性定时器