首页 > 技术文章 > 【结对开发】电梯调度 三 (最终版)

XianqinHu 2014-03-21 15:55 原文

信1101-2

20113026 胡弦琴

20112917 王兵茹

 

在上一次我们传的电梯调度二版本的基础上进行了一些改进及弥补,增加了门的动作,电梯调度二版本做了一些尝试例如调度四部电梯 但没有实现,于是便把心思花在完善它的现有功能上了,完善版功能如下:

(1)电梯的配置:

         1. 110层每层有上下两个按钮,1层只有上行按钮,10层只有下行按钮。每层都有相应的指示灯,灯亮表示该按钮已经被按下,如果该层的上行或者下行请求已经被响                  应,则指示灯灭。

        2. 电梯内共有10个目标按钮,表示有乘客要在该层下电梯。有指示灯指示按钮是否被按下。乘客按按钮导致按钮指示灯亮,如果电梯已经在该层停靠则该按钮指示灯灭。

  (2) 电梯的运行控制:

        1.电梯的初始状态是电梯位于第一层处,所有按钮都没有按下。

        2.乘客可以在任意时刻按任何一个目标钮和呼叫钮。呼叫和目标对应的楼层可能不是电梯当前运行方向可达的楼层。

        3. 如果电梯正在向I层驶来,并且位于I层与相邻层(向上运行时是I-1层或者向下运行时是I+1层)之间,则因为安全考虑不响应此时出现的I层目标或者请求。如果电梯正好经过了I楼层,运行在I楼层和下一楼层之间,则为了直接响应此时出现的I层目标或者请求,必须至少到达运行方向上的下一楼层然后才能掉头到达I楼层(假设掉头无须其它额外时间),如果I楼层不是刚刚经过的楼层则可以在任意位置掉头,此时掉头后经过的第一个楼层不可停。

       4. 电梯系统依照某种预先定义好的策略对随机出现的呼叫和目标进行分析和响应。

       5. 电梯停靠某一层后,苦无目标和呼叫,则电梯处于无方向状态,方向指示灯全灭,否则电梯内某个方向的指示灯亮,表示电梯将向该方向运行。

       6. 当一个目标(呼叫)已经被服务后,应将对应的指示灯熄灭。 

源程序如下(界面及功能实现代码):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace ElevatorManager
{
    public partial class Form1 : Form
    {
        const int UP = 0;
        const int DOWN = 1;
        const int EXTERIOR = 0;
        const int INTERIOR = 1;
        const int ELE1 = 0;
        const int ELE2 = 1;
 
        const int CLOSE = 0;
        const int OPEN = 1;
 
        List<Button> btnUpPanel;
        List<Button> btnDownPanel;
        List<Button> btnEle1;
        List<Button> btnEle2;
        Thread th_ui;
        ElevatorController myElevator;
        Image imgEleOpen;
        Image imgEleClose;
 
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                btnUpPanel = new List<Button>();
                btnDownPanel = new List<Button>();
                btnEle1 = new List<Button>();
                btnEle2 = new List<Button>();
 
                #region 控件获取
                btnUpPanel.Add(btn_1_up);
                btnUpPanel.Add(btn_2_up);
                btnUpPanel.Add(btn_3_up);
                btnUpPanel.Add(btn_4_up);
                btnUpPanel.Add(btn_5_up);
                btnUpPanel.Add(btn_6_up);
                btnUpPanel.Add(btn_7_up);
                btnUpPanel.Add(btn_8_up);
                btnUpPanel.Add(btn_9_up);
                btnUpPanel.Add(new Button());
 
                btnDownPanel.Add(new Button());
                btnDownPanel.Add(btn_2_down);
                btnDownPanel.Add(btn_3_down);
                btnDownPanel.Add(btn_4_down);
                btnDownPanel.Add(btn_5_down);
                btnDownPanel.Add(btn_6_down);
                btnDownPanel.Add(btn_7_down);
                btnDownPanel.Add(btn_8_down);
                btnDownPanel.Add(btn_9_down);
                btnDownPanel.Add(btn_10_down);
 
                btnEle1.Add(btn_e1_f1);
                btnEle1.Add(btn_e1_f2);
                btnEle1.Add(btn_e1_f3);
                btnEle1.Add(btn_e1_f4);
                btnEle1.Add(btn_e1_f5);
                btnEle1.Add(btn_e1_f6);
                btnEle1.Add(btn_e1_f7);
                btnEle1.Add(btn_e1_f8);
                btnEle1.Add(btn_e1_f9);
                btnEle1.Add(btn_e1_f10);
 
                btnEle2.Add(btn_e2_f1);
                btnEle2.Add(btn_e2_f2);
                btnEle2.Add(btn_e2_f3);
                btnEle2.Add(btn_e2_f4);
                btnEle2.Add(btn_e2_f5);
                btnEle2.Add(btn_e2_f6);
                btnEle2.Add(btn_e2_f7);
                btnEle2.Add(btn_e2_f8);
                btnEle2.Add(btn_e2_f9);
                btnEle2.Add(btn_e2_f10);
                #endregion
 
                string impath = @"e:\elevator_open.jpg";
                imgEleOpen = new Bitmap(impath);
                string impath2 = @"e:\elevator_close.jpg";
                imgEleClose = new Bitmap(impath2);
 
                myElevator=new ElevatorController();
                MessageBox.Show("初始化成功!!!");
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            th_ui = new Thread(new ThreadStart(UIController));
            th_ui.IsBackground=true;
            th_ui.Start();
        }
 
        public void UIController()//UI控制线程
        {
            try
            {
                for (; true; )
                {
                    #region 面板灯
                    for (int i = 0; i < 10; ++i)
                    {
                        if (myElevator.uppanel[i])
                        {
                            btnUpPanel[i].BackColor = Color.Yellow;
                        }
                        if (!myElevator.uppanel[i])
                        {
                            btnUpPanel[i].BackColor = Color.White;
                        }
                        //
                        if (myElevator.downpanel[i])
                        {
                            btnDownPanel[i].BackColor = Color.Yellow;
                        }
                        if (!myElevator.downpanel[i])
                        {
                            btnDownPanel[i].BackColor = Color.White;
                        }
                        //
                        if (myElevator.ele_1.panel[i])
                        {
                            btnEle1[i].BackColor = Color.Yellow;
                        }
                        if (!myElevator.ele_1.panel[i])
                        {
                            btnEle1[i].BackColor = Color.White;
                        }
                        //
                        if (myElevator.ele_2.panel[i])
                        {
                            btnEle2[i].BackColor = Color.Yellow;
                        }
                        if (!myElevator.ele_2.panel[i])
                        {
                            btnEle2[i].BackColor = Color.White;
                        }
                    }
                    #endregion
 
                    label_ele1.Text = "Ele1.floor:" + (myElevator.ele_1.floor + 1).ToString();
                    label_ele2.Text = "Ele2.floor:" + (myElevator.ele_2.floor + 1).ToString();
 
                    picture_ele1.Location = new Point(picture_ele1.Location.X, 500 - (50 * myElevator.ele_1.floor));
                    picture_ele2.Location = new Point(picture_ele2.Location.X, 500 - (50 * myElevator.ele_2.floor));
                     
                    if (myElevator.ele_1.gatestatus == CLOSE)
                    {
                        picture_ele1.Image = imgEleClose;
                    }
                    if (myElevator.ele_1.gatestatus == OPEN)
                    {
                        picture_ele1.Image = imgEleOpen;
                    }
                    if (myElevator.ele_2.gatestatus == CLOSE)
                    {
                        picture_ele2.Image = imgEleClose;
                    }
                    if (myElevator.ele_2.gatestatus == OPEN)
                    {
                        picture_ele2.Image = imgEleOpen;
                    }
 
                    Thread.Sleep(100);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_1_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 0);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_2_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 1);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_2_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 1);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_3_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 2);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_3_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 2);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_4_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 3);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_4_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 3);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_5_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 4);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_5_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 4);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_6_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 5);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_6_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 5);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_7_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 6);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_7_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 6);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_8_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 7);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_8_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 7);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_9_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 8);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_9_up_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, UP, 8);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_10_down_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(EXTERIOR, DOWN, 9);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f1_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 0);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f2_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 1);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f3_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 2);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f4_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 3);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f5_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 4);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f6_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 5);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f7_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 6);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f8_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 7);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f9_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 8);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e1_f10_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE1, 9);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f1_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 0);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f2_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 1);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f3_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 2);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f4_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 3);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f5_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 4);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f6_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 5);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f7_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 6);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f8_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 7);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f9_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 8);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btn_e2_f10_Click(object sender, EventArgs e)
        {
            try
            {
                myElevator.operate(INTERIOR, ELE2, 9);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void label_ele1_Click(object sender, EventArgs e)
        {
 
        }
    }
}

 运行结果如下:

 

推荐阅读