【发布时间】:2012-04-30 10:31:22
【问题描述】:
我在 C#.NET 中有一个似乎不是“更新”的简单标签。它仅显示我的应用程序的第一个初始值。在下面的代码中,“score”变量不会更新,但是在调用 messagebox.show 对话框时它会显示正确的值。分数值在不同的线程中更改,但我不认为这是调用和跨线程表单控制的问题(因为我在创建 label6 的线程中调用此代码)。
有谁知道可能是什么解决方案?我尝试了 Application.DoEvents() 方法但无济于事。此外,label6.Update() 和 label6.Refresh() 在 label6.Text = score 行之后似乎都不起作用。
Player 是我创建的一个类,将分数值保存为公共 int。
public Form1()
{
InitializeComponent();
createGame();
}
public void createGame()
{
InitializeComponent();
drawThread = new Thread(draw);
MessageBox.Show(player.score);
label6.Text = player.score;
}
public void draw()
{
//do drawing, change player.score value
//end thread
}
public void button_click()
{
if(firstrun)
drawThread.Start()
else{
createGame()
drawThread.Start()
}
}
编辑(来自 cmets): 这是一个 WinForms 应用程序。 label6.Text = score 行是调用 label6 的唯一实例,而不是在 Visual Studio 生成的 Form.Designer 代码中实例化。
【问题讨论】:
-
好的,你的主线程在做什么,那么,什么时候应该处理重绘等消息?
-
一个 - 通常你永远不想从你的代码中调用
Application.DoEvents。其次,你确定这家伙背后没有其他代码将标签文本设置为其他内容吗? -
可能你的标签没有更新,因为主线程很忙,无法处理消息队列。你能告诉我们更多代码吗?
-
+1 for @Tejs 拒绝浪费 CPU 的递归生成器。
-
我认为代码将有助于检查您在 MessageBox 和 Label 中从何处获得价值...