如何从另一个线程调用 Gtk API?

How can I call a Gtk API from another thread?

我写了一个 C 程序,我在其中实现了一些 threads 来制作 polling。当线程中发生某些事情时,我必须修改在 main 函数中创建的一些 Widgets。 当 thread 试图对 Widget 进行操作时,例如简单地调用函数 gtk_widget_hide,这个程序有时会崩溃,我发现那是因为我不能调用任何 GTK ] API 来自另一个线程。

在避免任何崩溃之前,我如何做我所描述的?考虑到我需要线程,这可能吗?

这是我的代码的一个例子

static GtkWidget* widget;

void check_user_action(){
    while(!user_does_action){
        g_sleep(1);
    }

    gtk_widget_hide(main_widget);
}

void main(){
    widget = //I skip widget creation
    gtk_widget_show_all(widget);

    g_thread_new("check_user_action", check_user_action, NULL);

    //do something else
}

这只是一个示例,但假设我必须 check_user_action 的唯一方法是使用 polling.

对于您的代码片段,您可以将任务传递给您的主线程:

gboolean my_hide_func(gpointer user_data)
{
    gtk_widget *widget = (gtk_widget*) user_data;
    gtk_widget_hide(widget);
    return FALSE;
}

void check_user_action(){
    while(!user_does_action){
        g_sleep(1);
    }
    g_idle_add(my_hide_func, main_widget);
}

这将在主线程运行您的 GTK 应用程序的队列中排队调用该函数的请求。