我用C语言编写了一个GTK 3应用程序。为了提高性能,我想把一些计算放在不同的线程中。目前我还没有决定如何具体实施。但我想我会使用一个GTask
来触发在单独的线程中运行。
我想在我的GUI上发出关于计算进度的某些状态更新。
我的想象是这样的:
我有一个calculation GObject,它有一个do_the_stuff_async()函数,可以触发线程/GTask。理想情况下,我想连接到一个“progress changed”信号,该信号提供我可以在GUI上显示的当前状态。任务完成后触发一个事件也很好,如果GTask
如何安全地从GTask/GThread向GTK主循环发送信号?
因为我还没有开始实现异步的东西:GTask是一个合适的方法还是应该使用完全不同的东西?
最佳答案
AGTask
适用于此。
要在不同线程中发出信号,请执行以下操作:
将主线程的GMainContext
存储在某处,并将其作为任务数据传递到GTask
中。
当您想发出一个信号时,用GSource
创建一个g_idle_source_new()
,为它添加一个回调,并将它附加到主线程的GMainContext
上。这将使得下次主线程的上下文迭代时在主线程中调用回调。
回调应根据需要调用g_signal_emit()
。
除非您想使从线程发出信号的GObject
安全,否则不应将其传递给GTask
工作线程。我的一般建议是避免锁定,只在工作线程之间传递不可变的对象。
注意,您可以使用g_idle_add()
创建空闲GSource
并将其添加到全局默认GMainContext
(GTK在主线程中使用的一个)。然而,这使得GMainContext
的使用不那么明确,从而降低了代码的可维护性。这不是我一般建议的方法。
关于c - 从glib/gtk中的单独线程发出信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57513541/