C / GTK在等待线程时更新UI

时间:2014-08-06 07:45:53

标签: c multithreading gtk gtk3

让我们来看看这些示例函数:

static gboolean
fill (gpointer data)
{
    gtk_progress_bar_pulse (GTK_PROGRESS_BAR (data));

    return TRUE;
}


static void
do_something (struct var *vars)
{
    GtkWidget *dialog, *contentArea;
    gint result;
    dialog = gtk_dialog_new_with_buttons ("pbar",
                     GTK_WINDOW (vars->mainwin),
                     GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                     _("Close"), GTK_RESPONSE_REJECT,
                     NULL);

    contentArea = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
    vars->pBar = gtk_progress_bar_new ();

    gtk_progress_bar_pulse (GTK_PROGRESS_BAR (vars->pBar));

    guint id = g_timeout_add (100, fill, GTK_PROGRESS_BAR (vars->pBar));

    gtk_container_add (GTK_CONTAINER (contentArea), vars->pBar);
    gtk_widget_show_all (dialog);

    GThread *n = g_thread_new(NULL, do_heavy, vars);

    result = gtk_dialog_run (GTK_DIALOG(dialog));
    switch (result)
    {
        case GTK_RESPONSE_REJECT:
            g_thread_join(n);
            g_source_remove(id);
            gtk_widget_destroy (dialog);
            break;
    }
}

当用户点击取消按钮时,progess栏更新冻结,直到线程完成。
如何在取消时阻止此行为并更新UI 按钮是否已被删除?

1 个答案:

答案 0 :(得分:1)

在线程上调用do_heavy()之前,您必须找到一种方法来通知线程它需要中断g_thread_join()。 (g_thread_join()只是等待线程完成。)

您可以使用GLib的multithreading facilities以多种方式执行此操作;例如,由互斥锁保护的标志变量。