单击按钮后,为什么我的 window 冻结了?
After I click a button, why does my window freeze?
我有一个 window 带有开始操作按钮。单击 window 按钮后冻结,但我想启动微调器。是C语言
这是按钮设置。
g_signal_connect(button, "clicked", G_CALLBACK(setVPN), entry);
函数设置VPN:
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;
功能正常。但是微调器没有启动,第一条消息也没有显示。此操作用于微调器并设置标签 window 在 return 之后执行。我尝试作为一个新流程来做,但那个替代方法不起作用。
感谢您的帮助。
当您的代码 不是 运行 时,GTK+ 会完成它的工作,即小部件的呈现等。它是单线程的,如果您的程序卡在 system()
中,GTK+ 就无法让 CPU 工作,例如绘制微调器。
你必须使用异步I/O。
此外,只需使用 g_strdup_printf()
来构建字符串。
我有一个 window 带有开始操作按钮。单击 window 按钮后冻结,但我想启动微调器。是C语言
这是按钮设置。
g_signal_connect(button, "clicked", G_CALLBACK(setVPN), entry);
函数设置VPN:
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;
功能正常。但是微调器没有启动,第一条消息也没有显示。此操作用于微调器并设置标签 window 在 return 之后执行。我尝试作为一个新流程来做,但那个替代方法不起作用。
感谢您的帮助。
当您的代码 不是 运行 时,GTK+ 会完成它的工作,即小部件的呈现等。它是单线程的,如果您的程序卡在 system()
中,GTK+ 就无法让 CPU 工作,例如绘制微调器。
你必须使用异步I/O。
此外,只需使用 g_strdup_printf()
来构建字符串。