gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:31:03 24 4
gpt4 key购买 nike

让我们看一下这些示例函数:

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;
}
}

当用户单击取消按钮时,进度条更新会卡住,直到线程完成。
如何在取消时阻止此行为并更新 UI 按钮被点击?

最佳答案

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

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

关于C/GTK 在等待线程时更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25154890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com