GTK定时器 – 如何在帧内制作定时器

g_timer_new如何工作?

有可能做一个

char timerz[50]; GTimer *timer g_timer_start(GTimer *timer); strcpy(timerz,(g_timer_elapsed(GTimer *timer)) 

或者我该怎么做才能在gtk_frame中有一个计时器?

祝你今天愉快! :d

您可以使用g_timeout_addg_timeout_add_seconds来定期调用超时函数。 请注意,此超时function可能会因事件处理而延迟,因此不应依赖于精确计时。 有关主循环的更多信息,请查看此开发人员页面 。
这是一个让你入门的例子(你可以通过这种方式即兴发挥)。 在示例中,超时设置为秒,因此使用g_timeout_add_seconds ,如果需要毫秒精度,请使用g_timeout_add

 #include  #include  #include  /* Determines if to continue the timer or not */ static gboolean continue_timer = FALSE; /* Determines if the timer has started */ static gboolean start_timer = FALSE; /* Display seconds expired */ static int sec_expired = 0; static void _quit_cb (GtkWidget *button, gpointer data) { (void)button; (void)data; /*Avoid compiler warnings*/ gtk_main_quit(); return; } static gboolean _label_update(gpointer data) { GtkLabel *label = (GtkLabel*)data; char buf[256]; memset(&buf, 0x0, 256); snprintf(buf, 255, "Time elapsed: %d secs", ++sec_expired); gtk_label_set_label(label, buf); return continue_timer; } static void _start_timer (GtkWidget *button, gpointer data) { (void)button;/*Avoid compiler warnings*/ GtkWidget *label = data; if(!start_timer) { g_timeout_add_seconds(1, _label_update, label); start_timer = TRUE; continue_timer = TRUE; } } static void _pause_resume_timer (GtkWidget *button, gpointer data) { (void)button;/*Avoid compiler warnings*/ if(start_timer) { GtkWidget *label = data; continue_timer = !continue_timer; if(continue_timer) { g_timeout_add_seconds(1, _label_update, label); } else { /*Decrementing because timer will be hit one more time before expiring*/ sec_expired--; } } } static void _reset_timer (GtkWidget *button, gpointer data) { (void)button; (void)data;/*Avoid compiler warnings*/ /*Setting to -1 instead of 0, because timer will be triggered once more before expiring*/ sec_expired = -1; continue_timer = FALSE; start_timer = FALSE; } int main(void) { GtkWidget *window; GtkWidget *vbox; GtkWidget *start_button; GtkWidget *pause_resume_button; GtkWidget *reset_button; GtkWidget *quit_button; GtkWidget *label; gtk_init(NULL, NULL); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); vbox = gtk_vbox_new (FALSE, 2); gtk_container_add(GTK_CONTAINER(window), vbox); label = gtk_label_new("Time elapsed: 0 secs"); start_button = gtk_button_new_with_label("Start"); g_signal_connect(G_OBJECT(start_button), "clicked", G_CALLBACK(_start_timer), label); pause_resume_button = gtk_button_new_with_label("Pause/Resume"); g_signal_connect(G_OBJECT(pause_resume_button), "clicked", G_CALLBACK(_pause_resume_timer), label); reset_button = gtk_button_new_with_label("Reset"); g_signal_connect(G_OBJECT(reset_button), "clicked", G_CALLBACK(_reset_timer), label); quit_button = gtk_button_new_with_label("Quit"); g_signal_connect(G_OBJECT(quit_button), "clicked", G_CALLBACK(_quit_cb), NULL); gtk_box_pack_start (GTK_BOX(vbox), label, 0, 0, 0); gtk_box_pack_start (GTK_BOX(vbox), start_button, 0, 0, 0); gtk_box_pack_start (GTK_BOX(vbox), pause_resume_button, 0, 0, 0); gtk_box_pack_start (GTK_BOX(vbox), reset_button, 0, 0, 0); gtk_box_pack_start (GTK_BOX (vbox), quit_button, 0, 0, 0); gtk_widget_show_all(window); g_timeout_add_seconds(1, _label_update, label); continue_timer = TRUE; start_timer = TRUE; gtk_main(); return 0; } 

希望这可以帮助!