我正在编写一个程序来演示 Dijkstra(和其他寻路算法)。
我希望程序在每一步之后暂停 - 这样学生就可以看到发生了什么。
目前我使用 MessageBox.Show() 来实现此目的,但这并不理想,因为它总是出现在操作前面。 这是我当前的暂停程序:
private async void Mypause()
{
switch (pauseMode)
{
case "Fast":
Thread.Sleep(1000);
break;
case "Medium":
Thread.Sleep(3000);
break;
case "Slow":
Thread.Sleep(8000);
break;
case "Wait":
MessageBox.Show("Click to continue", "Pause");
break;
default:
MessageBox.Show("no speed set");
break;
}
}
有什么想法吗?
我尝试使用复选框并等待状态更改,但即使我在等待循环中有 threading.sleep(100) - 表单上的按钮单击也会被忽略。
您永远不想在 UI 线程上使用
Thread.Sleep
。
您想要做的是修改您的算法,以便您可以一次运行一次迭代,或者可能运行
N
迭代。并且您想使用类/对象来表示算法的当前状态。也许类似
public class DjikstraState{
public MinHeap Open {get;}
public ClosedSet Closed {get;}
public Node CurrentNode {get; private set;}
public Node TargetNode {get;}
// Run a single iteration, returns true if the target was found.
public bool Step(){
...
}
然后您需要创建一个计时器,可以是 winforms 计时器,如果您使用的是 WPF,则可以是 DispatcherTimer。计时器将调用步骤方法一次或多次,然后更新 UI 以反映新状态。
可视化效果将取决于您拥有的图表类型。通过生成图像可以有效地可视化简单的网格。但您也可以使用画布或其他图形来表示其他类型的图表。
您可能应该制作一个 UI 来控制计时器频率或一次运行的步数。以及一些暂停或手动单步执行的方法。