2011-12-02 62 views
0

g_timer_new如何工作?GTK計時器 - 如何在一幀內製作計時器

是有可能做一個

char timerz[50]; 

GTimer *timer 


g_timer_start(GTimer *timer); 

strcpy(timerz,(g_timer_elapsed(GTimer *timer)) 

或者我能做什麼有一個gtk_frame計時器???

祝您有美好的一天! :D

+2

錯誤,這是你有一些可怕的代碼。 'g_timer_elapsed'返回一個gdouble&在strcpy中使用它不是一個好主意! gtk_frame中的定時器沒有意義:) ...要求是什麼?你想要定期更新任何元素嗎? –

+0

@ another.anon.coward我想要一個帶有計時器的框架,目前我在計時器中唯一發現的是GTimer,你知道另一種方式,我可以用一個不太可怕的代碼來完成這個任務嗎? Hehehe – drodri420

+0

當然有:)...你想顯示時間嗎?或時間流逝? –

回答

5

您可以使用g_timeout_addg_timeout_add_seconds,它將定期調用超時函數。請注意,此超時功能可能由於事件處理而延遲,因此不應依賴精確計時。有關主循環的更多信息,請查詢this developer page
下面是一個讓你開始的例子(你可以即興創作)。在示例中,超時設置爲秒,因此使用g_timeout_add_seconds,如果您需要毫秒精度,則使用g_timeout_add

#include <stdio.h> 
#include <string.h> 
#include <gtk/gtk.h> 

/* 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; 
} 

希望這有助於!