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

标签 c gtk3 glib gobject

我用 C 语言编写了一个 GTK3 应用程序。为了提高性能,我想将一些计算放在单独的线程中。目前我还没有决定具体如何实现。但我想我会选择一个 GTask,我将触发它在单独的线程中运行。

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

他们是我想象的方式:

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

实现

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

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

最佳答案

一个GTask适合这个。

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

  1. 存储GMainContext主线程的某处,并将其传递到 GTask作为任务数据。
  2. 当您想要发出信号时,请创建 GSourceg_idle_source_new() ,为其添加回调,并将其附加到 GMainContext主线程的。这将使下次主线程上下文迭代时在主线程中调用回调。
  3. 回调应调用 g_signal_emit()视情况而定。

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

请注意,您可以使用 g_idle_add()创建一个空闲GSource并将其添加到全局默认GMainContext (GTK 在主线程中使用的)。然而,这需要使用 GMainContext不太明确,因此使代码更难以维护。一般来说,这不是我推荐的方法。

关于c - 从 glib/gtk 中的单独线程发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57513541/

相关文章:

c - GLib:通过 UI 传播警告错误

c - gcc 中的段错误

c - 创建我们自己的头文件有什么用处

c - 还有另一种截断字符串的方法吗?

c++ - 为什么Glib::VariantBase::store方法破坏了给定缓冲区的开始

c - GHashTable (glib2) 线程安全吗?

c - lua中的动态ffi函数调用

c - GTK+3 自定义绘图区

python - 如何向 GTK 小部件添加额外数据?

ruby - 在 Ruby 中使用 GTK3 自定义信号