更改Gtk.Label.Text并不总是有效

时间:2013-11-02 02:53:41

标签: c# mono gtk gtk#

我有一个带有4个MenuItem的Gtk.Menu。每秒执行以下代码以更改每个MenuItem的Label.Text:

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

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

我在ubuntu linux上使用mono 2.10.8.1和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. 什么是更好的解决方案?

1 个答案:

答案 0 :(得分:3)

原因是您正在主GTK线程之外更新 GUI

当您调用 Gtk.Application.run 时,会创建拥有事件循环的主GTK线程

有几种方法可用于更新,您可以尝试 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可能会引起人们的兴趣。