提前感谢您的帮助。我不是一个程序员或学生,要求提供家庭作业帮助,只是一名技术人员帮助完成工作项目。
这个应该很容易,但我脑筋急转直,我需要你的帮助。我在C#中编写了一个GUI控制程序,但为了清楚起见,我将以半伪代码编写示例。我有两个布尔控制变量和void doSomething()方法列表。
bool ready = true;
bool willLoop = true;
runButton.Click(...) { ...
通过切换按钮将willLoop设置为true / false。我希望runButton.Click(...)遍历doSomethings()列表,每个都设置为false,然后在完成执行后返回true。当ready设置回true时,列表中的下一个Item将执行并将ready设置为false,并在完成时返回true。如果willLoop为true,则程序应反复遍历List,执行每个项目。如果有人按下切换按钮并在程序执行时将willLoop设置为true或false,我需要程序完成遍历列表然后停止(中断?)如果在最后一个Item执行后willLoop为false,或者迭代再次,如果willLoop是真的。所有的线程/实时内容都是自动处理的,我只需要一个(嵌套的?)循环结构,它将使用控制变量来完成我需要的工作。
我只对代码的循环/迭代部分感兴趣,所以伪代码很好。实际应用程序正在使用串行端口控制外部设备 - 列表中的每个项目都是向设备发送命令并将ready设置为false的方法。当设备完成移动时,它会向后发送一个字符串,并且该侦听器将就绪设置为true。
再次感谢您的帮助。
答案 0 :(得分:0)
您需要的结构类似于
runButton.Click(...) {
ready = true
while (willLoop)
for each item in list
ready = false
process item
wait until (ready == true)
}
我对C#不实用,但我认为Click
回调不是异步的,所以一旦你点击按钮,一切都会停止,你将无法再次切换它。您是否已经负责管理此类多线程问题?
答案 1 :(得分:0)
这是我的问题:
public partial class MyFormClass : Form
{
private bool ready = true;
private object readyLock = new object();
private bool willLoop = true;
List<Action> myFunctionList = new List<Action>();
private void button1_Click(object sender, EventArgs e)
{
Queue<Action> remainingActions = new Queue<Action>();
do
{
remainingActions = new Queue<Action>(myFunctionList);
while (remainingActions.Count > 0)
{
lock (readyLock)
{
// In case someone was already in the while,
// but took the last item in the queue.
if (remainingActions.Count == 0) break;
ready = false;
Action currentAction = remainingActions.Dequeue();
currentAction();
ready = true;
}
}
} while (willLoop);
}
}
您可以理解,您可以将“myFunctionList”替换为您希望存储函数列表的任何含义。