如何在c#中实现一步一步的按钮?

时间:2010-06-24 14:36:42

标签: c# winforms algorithm

我在c#中实现了一个算法,我想为它制作一个gui,在我的gui中我想放一个按钮,任意点击gui显示算法向前一步,所以我想我需要放一些像暂停?我的代码中的语句,任何点击它都可以恢复。我该怎么做?还是有任何其他建议来实现这个想法?

5 个答案:

答案 0 :(得分:15)

听起来你真的需要将算法变成状态机 - 而不是主动“暂停”它,你会主动“推进”它。

您可能会发现迭代器块很有用......如果您的算法目前在一种方法中很多,您可以更改它以在...处插入yield return语句每个逻辑步骤结束,返回当前状态的一些指示。

这不是迭代器块的完全正常使用,但它可能是这里最简单的方法。您的UI会在开始时调用GetEnumerator一次,然后在每次单击按钮时调用MoveNext()(然后访问Current属性以获取当前状态)。完成后不要忘记处理迭代器。

答案 1 :(得分:2)

  1. 在与UI线程不同的线程中运行算法。
  2. 要进行同步,请创建某种等待句柄,例如AutoResetEvent
  3. 您要查找的“暂停”语句是myWaitHandle.WaitOne()(由算法线程调用)。
  4. 通过在UI线程中执行myWaitHandle.Set()来继续算法。
  5. 此方法的优点是,在执行算法步骤时,您的用户界面会保持响应。

答案 2 :(得分:0)

您必须确定算法中的“步骤”。然后,您需要重写算法并将其包装在具有以下接口的类中:

interface ISteppedAlgorithm
{
    bool NextStep(); //returns if the algorithm is finished
    IStepResult LastStepResult {get;}
}

现在你的GUI将驱动以这种方式准备的算法。按下按钮后,将调用NextStep()方法。如果它返回false则禁用该按钮(或以任何其他方式指示它全部完成)。然后阅读LastStepResults并更新display.h

答案 3 :(得分:0)

根据您的描述,我认为您需要一个“向导”,它基本上是一个带有上一个/下一个按钮的应用程序。

http://www.differentpla.net/content/2005/02/implementing-wizard-c

但是如果你只是有一个长时间运行的任务,并希望在其中有一些中断,有不同的方法来解决它。

  1. 用多种方法为您完成任务。

    方法完成后,请等到用户点击下一个。

  2. 让任务在它自己的线程中运行,并且应该等待让线程休眠,直到你设置一个特定的var:

    LongRunningMethod1();
    while(continue1 == true)
    {
        Thread.Sleep(50);
    }
    LongRunningMethod2()
    while(continue2 == true)
    {
        Thread.Sleep(50);
    }
    
  3. 在主线程中将continue1和2设置为true,让后台线程完成其工作。

答案 4 :(得分:0)

如果只是为了“观察”算法开发时的状态,为什么不添加一些事件(最后可能只有一个)并让事件处理程序存储一个状态数组。用户可以根据需要简单地向前/向后迭代。