我编写了一个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/