【问题标题】:After I click a button, why does my window freeze?单击按钮后,为什么我的窗口冻结?
【发布时间】:2015-12-29 04:31:56
【问题描述】:

我有一个带有开始操作按钮的窗口。在我单击按钮窗口冻结后,但我想启动微调器。是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; 

功能正常。但是微调器不启动,并且第一条消息不显示。微调器和设置标签窗口的此操作在返回后执行。我尝试将其作为一个新流程进行,但该替代方法不起作用。

感谢您的帮助。

【问题讨论】:

    标签: c button window gtk freeze


    【解决方案1】:

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

    您必须使用异步 I/O。

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

    【讨论】:

    • 固定大小的堆栈缓冲区将对 VPN 字符串的长度施加任意限制(无论具体是什么)。要么使用变长数组,要么继续使用malloc...
    • @immibis 是的,这就是我说“合适”的原因,但我现在改变了它,因为 glib 公开了一个函数来做那种舞蹈。
    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多