让我们来看看这些示例函数:
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 按钮是否已被删除?
答案 0 :(得分:1)
在线程上调用do_heavy()
之前,您必须找到一种方法来通知线程它需要中断g_thread_join()
。 (g_thread_join()
只是等待线程完成。)
您可以使用GLib的multithreading facilities以多种方式执行此操作;例如,由互斥锁保护的标志变量。