gtk_widget_show_all(window);在等待函数返回值时无法正常工作

时间:2018-12-08 21:44:03

标签: c gtk gtk3

我正在制作飞镖游戏,并且已经创建了游戏页面的整个布局。我想等待一支飞镖击中棋盘,这可能需要花费可变的时间,然后更新该飞镖的分数,更新玩家剩余的剩余分数并更新回合分数。

我进行布局,调用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

2 个答案:

答案 0 :(得分:1)

当您的应用程序在单线程中运行时,此功能“ problem_causing_wait”将充当阻止功能并停止主循环。

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

path

答案 1 :(得分:0)

您不应该冻结UI。冻结UI意味着不刷新,即使需要刷新也是如此。例如,如果将另一个应用程序移到前台,然后将其移开,则您的应用程序仍必须重新绘制。您也无法显示飞镖剩余时间的倒计时。因此,您无法处理玩家完全错过目标的情况(在这里,您可能应该与UI互动,或者让回合倒计时到期并提供一些反馈)。

相反,根本不要使用线程,而是使用g_timeout_add每隔500毫秒检查一次飞镖是否击中电路板,让GTK +主循环处理您的I / O轮询。