我不允许使用线程,所以只能排队。
作为我们学校项目的一部分,我们必须实现一个代表电梯的工作动画。我已经完成了它背后的所有逻辑和动画(上下移动、开门等),它由button_click事件控制。例如:按钮1-向上移动电梯按钮2-向下移动电梯按钮3-打开电梯门按钮4-打开楼层门
我的问题是:当我点击按钮1时,电梯会向上移动,但如果我在按钮1处理完事件之前按下按钮2,我的代码就会崩溃,一切都会崩溃:))我想做的是有这样的逻辑:
-按钮1被按下并被添加到队列中,-按钮2在按钮1完成之前被按下,因此它被添加到队列的顶部并等待,直到按钮1停止处理,然后运行按钮2事件
我研究了排队的概念,发现这正是我所需要的。然而,我已经尝试了许多方法来实现这一点,每次都提交了申请。
如果有人能用一个例子来解释如何做到这一点,在哪里实现它(在哪里实际运行这个代码),或者给我一个很好的参考,那将是非常感激的。
设置队列和计时器。然后,您可以在Button_click事件期间使用队列将Button文本加载到队列中。计时器周期性地启动并取消查看CSharp队列和Windows From timer(例如)。
class Form1 : Form
{
Queue<string> ButtonQueue = new Queue<string>();
System.Windows.Forms.Timer theTimer = new System.Windows.Forms.Timer();
public Form1()
{
InitializeComponent();
buttonQueue = new Queue();
theTimer.Tick += new EventHandler(theTimer_Tick);
}
private void button_Click(object sender, EventArgs e)
{
if (sender.GetType().Name.Equals("Button"))
{
buttonQueue.Enqueue(((Button)sender).Text);
}
}
void theTimer_Tick(object sender, EventArgs e)
{
theTimer.Enabled = false;
switch (ButtonQueue.Dequeue().ToUpper())
{
case "UP":
//Run animation include Application.DoEvents() in the animation loop to prevent GUI lockup
break;
case "DOWN":
//Run animation include Application.DoEvents() in the animation loop to prevent GUI lockup
break;
case "OPEN":
//Run animation include Application.DoEvents() in the animation loop to prevent GUI lockup
break;
}
theTimer.Enabled = true;
} }
C#中有一个Queue
集合。
MSDN
public class ElevatorAction
{
public string Action { get; set; }
public void Act()
{
throw new NotImplementedException();
}
}
// Create two actions (up and down)
ElevatorAction upAction = new ElevatorAction{ Action = "Up" };
ElevatorAction downAction = new ElevatorAction{ Action = "Down" };
// Create the Queue
Queue<ElevatorAction> elevatorActionQueue = new Queue<ElevatorAction>();
// Add the actions from your button click events.
elevatorActionQueue.Enqueue(upAction); // call from button 1 click
elevatorActionQueue.Enqueue(downAction); // call from button 2 click
// Loop through the queue to perform the queued actions
ElevatorAction currentAction = new ElevatorAction();
while(elevatorActionQueue.Count > 0)
{
currentAction = elevatorActionQueue.Dequeue();
currentAction.Act();
}