令人耳目一新的SUDOKU解算器

时间:2018-02-24 16:24:20

标签: c# multithreading sudoku

我制作了一个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

2 个答案:

答案 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)在行之间没有变化时,它们都可以更新或读取相同的全局值。如果您对多线程编程不是很有经验,我建议不要在线程之间共享数据。也许您可以将其重新实现为单线程程序,而不是定期调用更新函数。