首页 文章

gtk_widget_show_all(窗口);在等待函数返回值时不工作

提问于
浏览
0

我正在做一个飞镖游戏,我已经创建了游戏页面的整个布局 . 我想等待飞镖击中棋盘,这需要花费不同的时间,然后更新该飞镖的分数,更新玩家剩下的剩余分数,并更新轮次分数 .

我进行布局,调用gtk_widget_show_all(window);,然后调用await_dart_hit();

直到飞镖击中时才会显示窗口 . 好像窗口在整个函数结束之前都无法显示,但我尝试在单独的函数中创建窗口,然后返回,然后调用await_dart_hit();这也不起作用 .

#include <gtk/gtk.h>

void problem_causing_wait(){
    while(1);
}

void start(){
    GtkWidget *window;

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Start");
    gtk_container_set_border_width(GTK_CONTAINER(window),10);
    gtk_window_set_default_size(GTK_WINDOW(window),1000,400);

    gtk_widget_show_all(window);

    problem_causing_wait();
}

int main(int argc, char *argv[]) {
    GtkWidget *window, *button, *button_box;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Welcome!");
    gtk_window_set_default_size(GTK_WINDOW(window),1000,400);

    button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
    gtk_container_add(GTK_CONTAINER(window),button_box);

    button = gtk_button_new_with_label("Get Started");
    g_signal_connect (button, "clicked", G_CALLBACK (start), NULL);
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
    gtk_container_add(GTK_CONTAINER(button_box),button);

    gtk_widget_show_all(window);

    gtk_main();

    return(0);
}

如果您运行此代码,您会看到一旦单击“开始”按钮,它就会冻结 . 尽管在调用problem_causing_wait()函数之前显示全部,但它不会显示“开始”窗口 .

请帮忙!

编译:gcc main.c -o main pkg-config --cflags --libs gtk+-3.0

1 回答

  • 1

    当您的应用程序在单个线程中运行时,此函数“problem_causing_wait”充当阻塞函数并停止主循环 .

    我认为使用“g_idle_add”和“g_thread_new”可能会解决您的问题 .

    #include <gtk/gtk.h>
    
    void *problem_causing_wait(){
        while(1);
        //update the Ui using g_idle_add
        return NULL;
    }
    
    void start(){
        GtkWidget *window;
    
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window),"Start");
        gtk_container_set_border_width(GTK_CONTAINER(window),10);
        gtk_window_set_default_size(GTK_WINDOW(window),1000,400);
    
        g_thread_new("dart-game",problem_causing_wait,NULL);
    
        gtk_widget_show_all(window);
    }
    
    int main(int argc, char *argv[]) {
        GtkWidget *window, *button, *button_box;
    
            //Initilizes Support for Concurrent Threads
        XInitThreads();
    
        gtk_init(&argc,&argv);
    
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window),"Welcome!");
        gtk_window_set_default_size(GTK_WINDOW(window),1000,400);
    
        button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
        gtk_container_add(GTK_CONTAINER(window),button_box);
    
        button = gtk_button_new_with_label("Get Started");
        g_signal_connect (button, "clicked", G_CALLBACK (start), NULL);
        //g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
        gtk_container_add(GTK_CONTAINER(button_box),button);
    
        gtk_widget_show_all(window);
    
        gtk_main();
    
        return(0);
    }
    

相关问题