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



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

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

他们的方式我想象:

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

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

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

GTask

适合于此。

要在其他线程中发出信号:

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

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

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

最新更新