带有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小部件的主要内容,如果未能解决你的问题,请参考以下文章
为啥以前在 iPad 上缓存时,SVG 中的图像并不总是从应用程序缓存中加载?
GTK3 使用带有 ID 的 CSS 从 GtkEntry 中删除蓝框