我编写了一个C程序,其中实现了一些threads来制作polling。当线程中发生某些事情时,我必须修改在Widgets函数中创建的某些main
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应用程序的主线程的队列中加入一个调用该函数的请求。

关于c - 如何从另一个线程调用Gtk API?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57658965/

10-11 22:15
查看更多