我有一个带有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 !!!
}
问题
答案 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可能会引起人们的兴趣。