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

时间:2011-12-02 05:11:20

标签: c timer gtk

g_timer_new如何运作?

可以做一个

char timerz[50];

GTimer *timer


g_timer_start(GTimer *timer);

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

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

祝你有愉快的一天! :d

1 个答案:

答案 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;
}

希望这有帮助!