我在c#中实现了一个算法,我想为它制作一个gui,在我的gui中我想放一个按钮,任意点击gui显示算法向前一步,所以我想我需要放一些像暂停?我的代码中的语句,任何点击它都可以恢复。我该怎么做?还是有任何其他建议来实现这个想法?
答案 0 :(得分:15)
听起来你真的需要将算法变成状态机 - 而不是主动“暂停”它,你会主动“推进”它。
您可能会发现迭代器块很有用......如果您的算法目前在一种方法中很多,您可以更改它以在...处插入yield return
语句每个逻辑步骤结束,返回当前状态的一些指示。
这不是迭代器块的完全正常使用,但它可能是这里最简单的方法。您的UI会在开始时调用GetEnumerator
一次,然后在每次单击按钮时调用MoveNext()
(然后访问Current
属性以获取当前状态)。完成后不要忘记处理迭代器。
答案 1 :(得分:2)
myWaitHandle.WaitOne()
(由算法线程调用)。myWaitHandle.Set()
来继续算法。此方法的优点是,在执行算法步骤时,您的用户界面会保持响应。
答案 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
但是如果你只是有一个长时间运行的任务,并希望在其中有一些中断,有不同的方法来解决它。
用多种方法为您完成任务。
方法完成后,请等到用户点击下一个。
让任务在它自己的线程中运行,并且应该等待让线程休眠,直到你设置一个特定的var:
LongRunningMethod1();
while(continue1 == true)
{
Thread.Sleep(50);
}
LongRunningMethod2()
while(continue2 == true)
{
Thread.Sleep(50);
}
在主线程中将continue1和2设置为true,让后台线程完成其工作。
答案 4 :(得分:0)
如果只是为了“观察”算法开发时的状态,为什么不添加一些事件(最后可能只有一个)并让事件处理程序存储一个状态数组。用户可以根据需要简单地向前/向后迭代。