我正在制作飞镖游戏,并且已经创建了游戏页面的整个布局。我想等待一支飞镖击中棋盘,这可能需要花费可变的时间,然后更新该飞镖的分数,更新玩家剩余的剩余分数并更新回合分数。
我进行布局,调用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
答案 0 :(得分:1)
当您的应用程序在单线程中运行时,此功能“ problem_causing_wait”将充当阻止功能并停止主循环。
我认为使用“ g_idle_add”和“ g_thread_new”可能会解决您的问题。
path
答案 1 :(得分:0)
您不应该冻结UI。冻结UI意味着不刷新,即使需要刷新也是如此。例如,如果将另一个应用程序移到前台,然后将其移开,则您的应用程序仍必须重新绘制。您也无法显示飞镖剩余时间的倒计时。因此,您无法处理玩家完全错过目标的情况(在这里,您可能应该与UI互动,或者让回合倒计时到期并提供一些反馈)。
相反,根本不要使用线程,而是使用g_timeout_add
每隔500毫秒检查一次飞镖是否击中电路板,让GTK +主循环处理您的I / O轮询。