gpt4 book ai didi

c - gtk_widget_show_all(窗口);等待函数返回值时不起作用

转载 作者:行者123 更新时间:2023-11-30 14:43:54 26 4
gpt4 key购买 nike

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

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

直到飞镖击中窗 Eloquent 会显示。就好像窗口在整个函数结束之前无法显示,但我尝试在单独的函数中创建窗口,然后返回,然后调用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

最佳答案

当您的应用程序在单线程中运行时,此函数“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);
}

关于c - gtk_widget_show_all(窗口);等待函数返回值时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com