具有 g_timeout_add 服务的 GTK3 并不总是更新 GTK 小部件

GTK3 with g_timeout_add service doesn't always update GTK widgets

我在 Ubuntu 16.

上使用 GTK+3 / GDK

我有一个 g_timer 服务例程,它执行一些繁忙的工作,然后更新一些 GTK 标签和图形小部件。

在某些情况下,我注意到 GDK 计时器的服务例程(使用 g_timeout_add() 设置)是否运行时间过长,并且 GTK+3 小部件不会从服务内的代码中更新常规。使用 GTK2 时:

gdk_threads_enter(); ... gdk_threads_exit();

建议解决此问题。然而,这些 GDK 线程调用已被 GTK+3 弃用。除了 'All GDK and GTK+ calls should be made from the main thread'

之外,我找不到任何更新的文档

到目前为止我找到的唯一解决方案是调用:

gtk_main_iteration_do(false);

在定时器服务例程结束时。这样做似乎总是迫使小部件使用更新后的数据重新绘制。

那么在 GTK+3 中是否有另一种推荐的方法来处理这个计时问题,或者 gtk_main_interation_do() 调用是否可以接受/最佳实践?

我还注意到,如果我将 g_timeout_add() 的间隔设置得太短,我测量的服务例程执行时间实际上会增加。我怀疑这可能是由于 GDK 主循环中与此计时器有关的额外代码软件中断代码 运行 引起的。但是我不知道如何证明这一点。 GTK3 / GDK 是否会出现这种观察结果?

对于你所做的,

gtk_main_iteration_do(false);

是进行 GUI 更新的好方法。您可以通过检查 events_pending .

来处理多个迭代

您可能也想看看 idle_add。这对于 GUI 更新完成后的 post-processing GUI 内容很有用。