2

我有一个带有 4 个菜单项的 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. 什么是更好的解决方案?
4

1 回答 1

3

这样做的原因是您在主 GTK 线程之外更新GUI

拥有事件循环的主 GTK 线程是在您调用Gtk.Application.run时创建的。

有几种方法可用于更新,您可以尝试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();
         }
    });

这个链接可能很有趣。

于 2013-11-02T15:43:31.017 回答