• 结对项目电梯调度--项目实施


    小组成员:汪洋,辛垧

    在项目的需求分析做好的3天后,终于开始准备实现这些功能了。因为是面向对象的思路,不慌不忙地先将elevatro类和control两个类的属性写好,但其中的方法确实还要好好琢磨一下。现在想想,我们之前写的需求分析很水,只是将一些属性包括了,一些很重要的方法没有写到,甚至没有想到(run() 以及 stop() 两个方法。不过如果没有之前的需求分析把问题想更的全面,现在就跪了,所以需求分析一定要具体一点,详细一点,在此特别感谢小组伙伴小垧同学的辛勤的努力和付出。

    好,现在回到主题。在写好类后,发现一个很棘手的问题,四部电梯,四个线程。而现在看多线程却很头疼的问题,所以偷了一下懒,改用timer这个控件来实现并发。宏观上是并发的,微观上还是串行的(当然即便是多线程在单处理器下也是这样),利用四个timer分别控制四部电梯。

    首先生成电梯的四个对象,初始化四部电梯。

    timer的enabled属性为true,intervel=2000,保证timer每隔2秒执行。

    电梯的run()方法执行。

    判断是否需要在电梯此时所在的楼层停留。

    因为考虑到每层的上下人数,进行判断此时是否符合电梯运行的要求。

    在此pose上run方法

     1 public void run()//run方法
     2         {
     3            
     4             if (El_statues)
     5             {
     6                 if (El_go_diraction == 1)
     7                 {
     8                     if (El_stay_floor < maxCount())
     9                     {
    10                         El_stay_floor++;
    11                     }
    12                     else
    13                     {
    14                         El_go_diraction = -1;
    15                     }
    16                 }
    17                 else if (El_go_diraction == -1)
    18                 {
    19                     if (El_stay_floor > 0)
    20                     {
    21                         El_stay_floor--;
    22                     }
    23                     else
    24                     {
    25                         El_go_diraction = 1;
    26                     }
    27                 }
    28             }
    29            
    30  }
    View Code

    stop方法(判断在这一层电梯是否需要停下来)

     1 public Boolean stop()
     2         {
     3             if (El_run_count[El_stay_floor] == 1||Pe_req_count[El_stay_floor] ==1)
     4             {
     5                 El_run_count[El_stay_floor] = 0;
     6                 Pe_req_count[El_stay_floor] = 0;
     7                 return false; }
     8             else
     9                 return true;
    10         }
    View Code

    同时一项很重要的判断方法,选择四部电梯此时到外部请求楼层时间最短的函数time

     1 public int Time(int Pe_stay_floor )
     2         {
     3             int i,count=0;
     4             int floor_gap=0;
     5             if (El_go_diraction == 1)
     6             {
     7                 if (Pe_stay_floor >= El_stay_floor)
     8                 {
     9                     floor_gap = Pe_stay_floor - El_stay_floor;
    10                     //the floor which the elevator possibly stopped
    11                     for (i = El_stay_floor; i <= Pe_stay_floor; i++)
    12                     {
    13                         if (El_run_count[i] == 1)
    14                         {
    15                             count++;
    16                         }
    17                     }
    18                    
    19                 }
    20                 else
    21                 {
    22                     floor_gap = 2*maxCount() - El_stay_floor - Pe_stay_floor;
    23                     //abc
    24                     for (i = Pe_stay_floor; i <= 20; i++)
    25                     {
    26                         if (El_run_count[i] == 1)
    27                             count++;
    28                     }
    29                     
    30                 }
    31             }
    32             else if (El_go_diraction == -1)
    33             {
    34                 if (Pe_stay_floor <= El_stay_floor)
    35                 {
    36                     floor_gap = El_stay_floor - Pe_stay_floor;
    37                     for (i = Pe_stay_floor; i <= El_stay_floor; i++)
    38                     {
    39                         if (El_run_count[i] == 1)
    40                             count++;
    41                     }
    42               
    43                 }
    44                 else
    45                 {
    46                     floor_gap = El_stay_floor + Pe_stay_floor;
    47                     for (i = 0; i <= Pe_stay_floor; i++)
    48                     {
    49                         if (El_run_count[i] == 1)
    50                             count++;
    51                     }
    52                 }
    53             }
    54             El_alltime = floor_gap * El_run_time_one + count * El_stay_time;
    55             return El_alltime;
    56         }
    57     }
    View Code

    同时在timer.tick()方法中是timer自动循环调用的部分:

     1 private void timer3_Tick(object sender, EventArgs e)
     2         {
     3             if (eq3.El_statues)
     4             {
     5                 eq3.run();
     6                 int temp = 0;
     7                 timer3.Enabled = (eq3.stop() && timer3.Enabled);
     8                 if (timer3.Enabled == false)
     9                 {
    10                     label3.BackColor = Color.Red;
    11                     //eq1.check2(Convert.ToInt32(listBox1.SelectedItem));
    12                     temp = Convert.ToInt32(listBox3.SelectedItem);
    13                     eq3.El_people = eq3.El_people + temp;
    14                     eq3.El_weight = eq3.El_weight + temp * 60;
    15                     if (eq3.El_people > eq3.El_st_people || eq3.El_weight > eq3.El_st_weight || eq3.El_people < 0)
    16                     {
    17                         timer3.Enabled = false;
    18                         eq3.El_people = eq3.El_people - temp;
    19                         eq3.El_weight = eq3.El_weight - temp * 60;
    20                         textBox10.Text = eq3.El_people.ToString();
    21                         textBox11.Text = eq3.El_weight.ToString();
    22                         MessageBox.Show("3号电梯处于非正常状态!");
    23                     }
    24                     else
    25                     {
    26 
    27                     }
    28 
    29                 }
    30                 else
    31                 { label3.BackColor = Color.Green; }
    32 
    33                 textBox3.Text = eq3.El_stay_floor.ToString();
    34                 if (eq3.El_go_diraction == 1 && eq3.El_stay_floor != 0)
    35                     textBox3.AppendText("  向上");
    36                 else if (eq3.El_go_diraction == -1 && eq3.El_stay_floor != 0)
    37                     textBox3.AppendText("  向下");
    38                 else
    39                     textBox3.AppendText("  静止");
    40                 textBox10.Text = eq3.El_people.ToString();
    41                 textBox11.Text = eq3.El_weight.ToString();
    42             }
    43         }

    这只是一部电梯的部分,其余的与这一样一样的。

    以上是我们小组项目电梯实现的核心代码。

    现在pose界面设计的局部图片:

    附录时间表:

    时间 3.12 3.12 3.13 3.14上午 3.14下午 3.15上午 3.16上午 3.16下午
    汪洋 对方法实现的构思 写好elevator类 学习多线程 换掉多线程使用timer控件 对控制stop,run的修改 讨论电梯的控制,并提出修改   完成alpha版
    辛垧 写好control类 多线程编程 界面的设计与修改 界面的完善
  • 相关阅读:
    sl学习
    xc笔记
    1_2_3_4_5 Html-Css
    linux服务器架设--学习笔记
    注解学习
    关于ruby gem源更新安装问题
    css3:2D与3D变形
    css3关键帧动画以及兼容性策略
    css3背景,蒙版,倒影以及过度
    阴影边框以及渐变
  • 原文地址:https://www.cnblogs.com/FakerWang/p/3603821.html
Copyright © 2020-2023  润新知