gtk2.0定时器操作

⌚Time: 2025-04-18 15:49:00

👨‍💻Author: Jack Ge

GTK 2.0 定时器的启动和销毁停止

在 GTK 2.0 中,定时器功能主要通过 g_timeout_add() 系列函数实现。以下是关于 GTK 2.0 定时器的详细使用方法:

启动定时器

基本定时器

guint g_timeout_add(guint interval, GSourceFunc function, gpointer 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);

停止定时器

要停止定时器,可以使用 g_source_remove() 函数:

gboolean g_source_remove(guint tag);

示例:

#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;
}

注意事项

  1. 定时器回调函数在主事件循环中执行,不应执行耗时操作
  2. 回调函数返回 FALSE 会自动移除定时器
  3. 使用 g_source_remove() 可以手动移除定时器
  4. 定时器精度不是绝对精确,受系统负载影响
  5. 在 GTK 主循环 (gtk_main()) 运行前添加的定时器也会生效

以上就是在 GTK 2.0 中使用定时器的主要方法。


补充,定时器回调函数返回true是循环定时器,返回false是一次性定时器