C 从glib/gtk中的单独线程发出信号
我已经用C编写了一个GTK3应用程序。为了提高性能,我想在不同的线程中进行一些计算。目前我还没有决定如何具体实施它。但是我想我将使用一个C 从glib/gtk中的单独线程发出信号,c,gtk3,glib,gobject,C,Gtk3,Glib,Gobject,我已经用C编写了一个GTK3应用程序。为了提高性能,我想在不同的线程中进行一些计算。目前我还没有决定如何具体实施它。但是我想我将使用一个GTask,我将触发它在一个单独的线程中运行 我想在GUI上发出有关计算进度的某些状态更新 他们就像我想象的那样: 我有一个计算GObject,它有一个do_the_stuff_async()函数,用于触发线程/GTask。理想情况下,我希望连接到一个“进度已更改”信号,该信号提供我可以在GUI上显示的当前状态。此外,在任务完成后触发事件也很好,使用GTask
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()
创建一个idleGSource
,并将其添加到全局默认值gmainotext
(GTK在主线程中使用的一个)。但是,这使得GMainContext
的使用不那么明确,因此代码的可维护性也就降低了。一般来说,这不是我推荐的方法。顺便说一句,g\u idle\u add
自动附加到默认上下文(GUI上下文),我明确避免建议,因为使用默认的gmaintext
会使代码更难维护。不过,这会管用的。我将编辑我的答案以提及这一点。@PhilipWithall您是否可以使用gtask发布一个简单的示例。我试图理解gnome站点上给出的示例,但没有得到任何结果,谢谢这里有一些代码示例