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