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

时间:2018-03-02 18:46:02

标签: timer gtk3 gdk

我在Ubuntu 16上使用GTK + 3 / GDK。

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

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

gdk_threads_enter(); ... gdk_threads_exit();

建议解决此问题。但是这些GDK线程调用已被GTK + 3弃用。我找不到任何更新的文档,除了'所有GDK和GTK +调用应该来自主线程'

到目前为止,我找到的唯一解决方案是致电:

gtk_main_iteration_do(false);

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

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

我也注意到,如果我将g_timeout_add()的间隔设置得太短,那么我测量的服务程序执行时间实际上会增加。我怀疑这可能是由GDK主循环中运行的额外代码软件中断代码引起的。但是我不知道如何证明这一点。 GTK3 / GDK预计会出现这种情况吗?

1 个答案:

答案 0 :(得分:0)

对于你正在做的事情,

gtk_main_iteration_do(false);

是进行GUI更新的好方法。您可以通过选中events_pending 来处理多个迭代。

您也可以查看idle_add。这对GUI更新完成后的GUI后处理非常有用。