C 从glib/gtk中的单独线程发出信号

C 从glib/gtk中的单独线程发出信号,c,gtk3,glib,gobject,C,Gtk3,Glib,Gobject,我已经用C编写了一个GTK3应用程序。为了提高性能,我想在不同的线程中进行一些计算。目前我还没有决定如何具体实施它。但是我想我将使用一个GTask,我将触发它在一个单独的线程中运行 我想在GUI上发出有关计算进度的某些状态更新 他们就像我想象的那样: 我有一个计算GObject,它有一个do_the_stuff_async()函数,用于触发线程/GTask。理想情况下,我希望连接到一个“进度已更改”信号,该信号提供我可以在GUI上显示的当前状态。此外,在任务完成后触发事件也很好,使用GTask

我已经用C编写了一个GTK3应用程序。为了提高性能,我想在不同的线程中进行一些计算。目前我还没有决定如何具体实施它。但是我想我将使用一个
GTask
,我将触发它在一个单独的线程中运行

我想在GUI上发出有关计算进度的某些状态更新

他们就像我想象的那样:

我有一个计算GObject,它有一个do_the_stuff_async()函数,用于触发线程/GTask。理想情况下,我希望连接到一个“进度已更改”信号,该信号提供我可以在GUI上显示的当前状态。此外,在任务完成后触发事件也很好,使用
GTask

如何安全地将信号从GTask/GThread发送到GTK主循环


因为我还没有开始实现异步的东西:GTask是一种合适的方法还是我应该使用完全不同的东西?

a
GTask
适用于此

要在不同线程中发出信号,请执行以下操作:

  • 将主线程的
    GMainContext
    存储在某个位置,并将其作为任务数据传递到
    GTask
  • 要发出信号时,请使用
    g\u idle\u source\u new()
    创建
    GSource
    ,为其添加回调,并将其附加到主线程的
    GMainContext
    。这将使回调在下一次主线程的上下文迭代时在主线程中被调用
  • 回调应根据需要调用
    g\u signal\u emit()
  • 除非您希望使
    GObject
    成为从线程发出信号的安全对象,否则不应将其传递给
    GTask
    工作线程。我的一般建议是避免锁定,只在工作线程之间传递不可变的对象


    请注意,您可以使用
    g_idle_add()
    创建一个idle
    GSource
    ,并将其添加到全局默认值
    gmainotext
    (GTK在主线程中使用的一个)。但是,这使得
    GMainContext
    的使用不那么明确,因此代码的可维护性也就降低了。一般来说,这不是我推荐的方法。

    顺便说一句,
    g\u idle\u add
    自动附加到默认上下文(GUI上下文),我明确避免建议,因为使用默认的
    gmaintext
    会使代码更难维护。不过,这会管用的。我将编辑我的答案以提及这一点。@PhilipWithall您是否可以使用gtask发布一个简单的示例。我试图理解gnome站点上给出的示例,但没有得到任何结果,谢谢这里有一些代码示例