繁体   English   中英

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

[英]Emit signal from separate thread in glib/gtk

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

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

他们以我想象的方式:

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

如何安全地从 GTask/GThread 向我的 GTK 主循环发出信号?

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

GTask适合于此。

要在不同的线程中发出信号:

  1. 将主线程的GMainContext存储在某处,并将其作为任务数据传递到GTask中。
  2. 当你想发出一个信号时,用g_idle_source_new()创建一个GSourceg_idle_source_new()添加一个回调,并将其附加到主线程的GMainContext中。 这将使回调在下一次主线程的上下文迭代时在主线程中被调用。
  3. 回调应该适当地调用g_signal_emit()

除非您想让GObject从线程安全地发出信号,否则不应将其传递给GTask工作线程。 我的一般建议是仅通过将不可变对象传入和传出工作线程来避免锁定。

请注意,您可以使用g_idle_add()创建一个空闲的GSource并将其添加到全局默认GMainContext (GTK 在主线程中使用的一个)。 然而,这使得GMainContext的使用不那么明确,从而使代码的可维护性降低。 这不是我一般推荐的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM