我正在做一个飞镖游戏,我已经创建了游戏页面的整个布局 . 我想等待飞镖击中棋盘,这需要花费不同的时间,然后更新该飞镖的分数,更新玩家剩下的剩余分数,并更新轮次分数 .
我进行布局,调用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 回答
当您的应用程序在单个线程中运行时,此函数“problem_causing_wait”充当阻塞函数并停止主循环 .
我认为使用“g_idle_add”和“g_thread_new”可能会解决您的问题 .