我有一个通过调用g_thread_new()产生工作线程的应用程序。工作线程必须向正在基于接收到的数据更新GUI的主线程发送进度信息或可能发生的错误。
当前我正在使用:
gtk_main_context_invoke(NULL, (GSourceFunc)update_gui, data);
第一个参数(类型为GMainContext *)等于NULL以便在主循环上下文中运行update_gui(),以便工作人员可以继续进行实际工作。
浏览文档时,我发现了一个功能:
guint g_idle_add (GSourceFunc function, gpointer data);
此功能是否更适合我的应用程序,还是应该使用完全不同的功能将事件从工作线程传输到主线程?
这些功能是等效的。 g_main_context_invoke()
是g_idle_add()
的包装,如果在当前线程拥有的GMainContext
上调用,则避免了消息传递的需要(在您的示例中不是这种情况,但无害)。
请注意,该功能为g_main_context_invoke()
,而不是gtk_main_context_invoke()
。据我所知,后者不存在。同样,它是g_idle_add()
而不是gtk_idle_add()
。
g_main_context_invoke()
和g_idle_add()
都由GLib提供,而不是GTK。 GTK使用GLib,但此特定功能不是必需的。