C#窗体首次完成后要执行的按钮的队列数



我不允许使用线程,所以只能排队。

作为我们学校项目的一部分,我们必须实现一个代表电梯的工作动画。我已经完成了它背后的所有逻辑和动画(上下移动、开门等),它由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();
}

相关内容

  • 没有找到相关文章