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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有g_timeout_add服务的GTK3并不总是更新GTK小部件相关的知识,希望对你有一定的参考价值。

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

答案

对于你在做什么,

gtk_main_iteration_do(false);

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

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

以上是关于带有g_timeout_add服务的GTK3并不总是更新GTK小部件的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS并不总像它看起来那么可靠

为啥以前在 iPad 上缓存时,SVG 中的图像并不总是从应用程序缓存中加载?

GTK3 使用带有 ID 的 CSS 从 GtkEntry 中删除蓝框

扩展器内带有树视图的 Gtk 3.0 窗口

Gtk.CssProvider() 基于 ID 的选择器如何在 Gtk3 中工作?

Perl/Gtk3,给窗口添加背景图片