【问题标题】:What is the difference between gtk_idle_add() and gtk_main_context_invoke() in gtk2?gtk2 中的 gtk_idle_add() 和 gtk_main_context_invoke() 有什么区别?
【发布时间】:2020-03-04 18:26:25
【问题描述】:

我有一个应用程序通过调用 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);

这个函数会更适合我的应用程序,还是应该使用完全不同的函数将事件从工作线程传输到主线程?

【问题讨论】:

    标签: c multithreading gtk glib gtk2


    【解决方案1】:

    这些功能是等价的。 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,但此特定功能不需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      相关资源
      最近更新 更多