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

时间:2019-08-26 13:32:49

标签: c multithreading gtk polling

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

在避免发生任何崩溃之前,我该怎么做?考虑到我需要线程,有可能吗?

这是我的代码做什么的一个例子

GTK

那只是一个例子,但假设我必须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

1 个答案:

答案 0 :(得分:1)

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

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应用程序的主线程的队列中排队一个调用该函数的请求。