2013-11-02 102 views
2

我有一个Gtk.Menu与4 MenuItems。下面的代码被执行,每秒改变每个菜单项的Label.Text:更改Gtk.Label.Text并不总是工作

double d = new Random().NextDouble(); 

for (int i = 0; i < 4; i++) 
{ 
    ((Label)((MenuItem)menu.Children[i]).Child).Text = d.ToString(); 
} 

我使用单2.10.8.1用在Ubuntu Linux MonoDevelop的3.0.3.2。

问题

的问题是,并不是所有的标签都得到更新(有时只有第一和第二,有时只有第一个和最后一个)。

我快速的黑客

我可以让1毫秒线程睡在每个循环解决这个问题:

for (int i = 0; i < 4; i++) 
{ 
    ((Label)((MenuItem)menu.Children[i]).Child).Text = d.ToString(); 
    Thread.Sleep(1); // HACK !!! 
} 

问题

  1. 的原因是什么对于这个问题?
  2. 什么是更好的解决方案?

回答

3

这样做的原因是,要更新的GUI从资本家主要GTK线程之外。

主要GTK线程,谁拥有的事件循环,当你调用Gtk.Application.run创建。

有几种方法avalaible进行更新,你可以尝试Gtk.Application.Invoke

Gtk.Application.Invoke (delegate { 
     double d = new Random().NextDouble(); 

     for (int i = 0; i < 4; i++) { 
      ((Label)((MenuItem)menu.Children[i]).Child).Text = d.ToString(); 
     } 
    }); 

link可能会感兴趣。

+0

非常感谢,这正是我一直在寻找的。 – sergej