我制作了一个SUDOKU解算器。何时解决一个数字应该写入屏幕,但只有在解算器完成时才会发生。为什么屏幕完成后才会刷新? ii是数字,jj是行,ll是collumn
private void MainForm_Load(object sender, EventArgs e)
{
...
Thread tr2 = new Thread(adatbszal);
tr2.Start();
}
private void adatbszal()
{
while (fut)
{
Thread.Sleep(10);
if (adat[jj, ll] != 0)
{
SetText(jj, ll, adat[jj, ll].ToString());
}
else
{
SetText(jj, ll, "");
}
}
}
private void SetText(int i, int j, string adat2)
{
if (adatB[i,j].InvokeRequired)
{
valami d = new valami(SetText);
Invoke(d, new object[] { i, j, adat2 });
}
else
{
adatB[i, j].Text = adat2;
}
}
...
Thread th = new Thread(solver);
th.Start();
完整项目:https://drive.google.com/file/d/1sZTA4Ledfwl3romBY2UTvUoU9MZfY35g/view?usp=sharing
答案 0 :(得分:0)
我建议在Invoke(d, new object[] { i, j, adat2 });
上设置一个断点来验证它是否到达,如果是,在步进之前向if (adatB[i,j].InvokeRequired)
添加一个断点,然后确保收到相同的参数验证Invoke
是否按预期触发SetText
。 (Step Into会更简单,但我不确定它是否适用于Invoke Line。)
如果一切正常,那么检查显示是否更新,然后在调试器中执行adatB[i, j].Text = adat2;
。
答案 1 :(得分:0)
我认为您的代码正在按照您的意愿更新显示,但在其他方面它无法正常工作。在我的一个测试中,它只是将第一个单元设置为" 2"一遍又一遍,所以你不会看到任何变化。在验证显示正确更新之前,您需要验证代码是否正常工作。我认为你可能会看到很多问题,因为有3个线程同时运行,当其他线程假设这些值(如jj
)在行之间没有变化时,它们都可以更新或读取相同的全局值。如果您对多线程编程不是很有经验,我建议不要在线程之间共享数据。也许您可以将其重新实现为单线程程序,而不是定期调用更新函数。