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

问题描述 投票:0回答:1

我在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预计会出现这种情况吗?

timer gtk3 gdk
1个回答
0
投票

对于你在做什么,

gtk_main_iteration_do(false);

进行GUI更新是一种很好的方法。您可以通过检查events_pending 来处理多个迭代。

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

© www.soinside.com 2019 - 2024. All rights reserved.