启动时的事件信号



我在写一个倒计时计时器。它由单个窗口组成,其中有一个标签,其中显示时间。"计时器()"(在下面的代码中)作为线程生成。这在linux环境中可以完美地工作,但就我而言,GTK不支持windows下的多线程(如果我错了请纠正我)。是否有可能在不使用线程的情况下生成"timer()",例如在main_window出现时调用信号?

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <gtk/gtk.h>
GtkWidget *window;
GtkWidget *label;
pthread_t timer_thread;
void* timer()
{
    while(1)
    {
        // some code here to calculate time
        gtk_label_set_markup ((GtkLabel*)label, time_c);
        sleep(1);
    }
}
static gboolean delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
{
    return FALSE;
}
static void destroy( GtkWidget *widget, gpointer data )
{
    gtk_main_quit ();
}
int main(int argc, char **argv)
{
    g_thread_init(NULL);
    gdk_threads_init();  
    gdk_threads_enter();
    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL);
    g_signal_connect (window, "destroy", G_CALLBACK (destroy), NULL);
    label = gtk_label_new("");
    gtk_container_add (GTK_CONTAINER (window), label);
    gtk_widget_show (label);
    gtk_widget_show (window);
    pthread_create(&timer_thread, NULL, timer, NULL);   
    gtk_main ();
    gdk_threads_leave();
    return 0;
}

我试着这样做,定时器()产生正确,但主窗口从未出现:

    static void timer( GtkWidget *widget, gpointer data )
    {
        while(1)
        {
            g_print("something"); //for checking
            // some code here to calculate time
            gtk_label_set_markup ((GtkLabel*)label, time_c);
            sleep(1);
        }
    }
int main(int argc, char **argv)
{
    g_signal_connect (window, "show", G_CALLBACK (timer), NULL);
}

提前感谢!

您最好使用计时器。调查g_timeout_add。这里有一个例子:GTK+事件和信号。

使用g_timeout_addGTimer。初始化您的GTimer,并在超时回调时调用g_timer_elapsed。只依赖调用g_timeout_add时使用的时间会导致计时不准确。

最新更新