c# 中的暂停/继续按钮

问题描述 投票:0回答:1

我正在编写一个程序来演示 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) - 表单上的按钮单击也会被忽略。

c# pause
1个回答
0
投票

您永远不想在 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 来控制计时器频率或一次运行的步数。以及一些暂停或手动单步执行的方法。

© www.soinside.com 2019 - 2024. All rights reserved.