我必须每1秒/ 0.1秒/ 0.5秒等更新3 Gtk.Label和几个Gtk.DrawingArea ,但我不知道为什么 该软件在大约10秒后冻结 。
我尝试了 gtk.gdk.threads_enter / leave 或使用 lock ,但无论如何更新并非同时发生,但是相反它是顺序的。(所以没有任何Gtk.Widget与几个回调共享)
让我们来看看代码:
#updating Gtk.DrawingArea
for ip in self.__cpu_info.keys():
self.__cpu_info[ip]['drawing_area'].show()
self.__cpu_info[ip]['drawing_area'].queue_draw()
#updating Gtk.Label
self.__Media_aritmetica_Label.set_text('%.2f' % self.__cpu_medie['media_aritmetica'])
self.__Media_mobile_Label.set_text('%.2f' % self.__cpu_medie['media_mobile'])
self.__Mediana_Label.set_text('%.2f' % self.__cpu_medie['mediana'])
注意:: 软件冻结只有上面两件中的一件(因此两者都需要更少的时间来冻结)
答案 0 :(得分:0)
您需要使用GObject.idle_add
(GObject.timeout_add
允许您完全摆脱第二个线程)使用修改/访问GtkWidget
的函数。必须从一(1)个线程调用对绘图相关函数的所有访问! idle/timeoout_add
将回调序列化为glib mainloop,这就是你想要的。