如何从另一个线程调用 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 应用程序的队列中排队调用该函数的请求。
我写了一个 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 应用程序的队列中排队调用该函数的请求。