簡體   English   中英

C GTK +啟動時的事件信號

[英]C GTK+ Event signal on startup

我正在寫一個倒數計時器。 它由一個帶有標簽的單個窗口組成,其中顯示時間。 “ timer()”(在下面的代碼中)作為線程產生。 這在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;
}

我嘗試這樣做,timer()正確生成,但是主窗口從未出現:

    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時使用的時間會導致計時不准確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM