单击按钮后,为什么我的窗口会冻结?

时间:2015-10-01 07:49:51

标签: 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), "<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; 

Fucntion工作正常。但旋转器没有启动,并且第一条消息没有显示。返回后,对旋转器和设置标签窗口执行此操作。我尝试做一个新的过程,但那个替代方案不起作用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

当您的代码运行时,GTK +会完成其工作,即渲染小部件等。它是单线程的,如果你的程序卡在system()里面,那么GTK +就无法让CPU去做工作,就像绘制微调器一样。

您必须使用异步I / O.

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