C 在我点击一个按钮后,为什么我的窗口会冻结?

C 在我点击一个按钮后,为什么我的窗口会冻结?,c,button,window,gtk,freeze,C,Button,Window,Gtk,Freeze,我有一个窗口,上面有启动按钮。单击按钮后,窗口冻结,但我想启动微调器。它是用C语言编写的 这是按钮设置 g_signal_connect(button, "clicked", G_CALLBACK(setVPN), entry); 函数setVPN: const gchar *vpn; gtk_spinner_start(GTK_SPINNER(spinner)); //start spinner gtk_label_set_markup(GTK_LABEL(msg), "&

我有一个窗口,上面有启动按钮。单击按钮后,窗口冻结,但我想启动微调器。它是用C语言编写的

这是按钮设置

g_signal_connect(button, "clicked", G_CALLBACK(setVPN), entry);
函数setVPN:

const gchar *vpn;

    gtk_spinner_start(GTK_SPINNER(spinner)); //start spinner
    gtk_label_set_markup(GTK_LABEL(msg), "<span foreground=\"#000000\">Probýhá změna VPN...</span>");

    vpn = gtk_entry_get_text(GTK_ENTRY(entry));

    char *ask; // Create system aks
    ask = malloc(30+strlen(vpn));
    strcpy(ask, "bash /bin/VPNSet/makeFile.sh ");
    strcat(ask, vpn);
    system(ask);
    free(ask);

    gtk_label_set_markup(GTK_LABEL(msg), "<span foreground=\"#00EE00\">Hotovo: VPN bylo změněno</span>");
    //message("Uspěch","VPN bylo změněno.");
    gtk_spinner_stop(GTK_SPINNER(spinner)); //stop spinner
    return; 
const gchar*vpn;
gtk_旋转器启动(gtk_旋转器(旋转器))//启动微调器
gtkýU标签设置标记(gtkýU标签(msg),“Probýházměna VPN…”);
vpn=gtk_entry_get_text(gtk_entry(entry));
char*ask;//创建系统aks
ask=malloc(30+strlen(vpn));
strcpy(询问“bash/bin/VPNSet/makeFile.sh”);
strcat(ask,vpn);
系统(ask);
免费(问);
gtk_标签集标记(gtk_标签(msg),“Hotovo:VPN bylo změněno”);
//信息(“Uspěch”、“VPN bylo změněno.”;
gtk_旋转器_停止(gtk_旋转器(旋转器))//停止旋转器
返回;
功能正常。但旋转器不会启动,第一条消息也不会显示。此操作用于微调器和设置标签窗口返回后执行。我试着做一个新的过程,但这个替代方案不起作用


感谢您的帮助。

GTK+在代码未运行时完成其工作,即呈现小部件等。它是单线程的,如果您的程序被卡在
system()中
GTK+无法让CPU工作,比如绘制微调器

您必须使用异步I/O


另外,只需使用来构建字符串。

固定大小的堆栈缓冲区会对VPN字符串的长度施加任意限制(不管具体是什么)。要么使用可变长度数组,要么继续使用
malloc
..@immibis是的,这就是为什么我说“适当”,但我现在改变了它,因为glib公开了一个函数来完成这个舞蹈。