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

本文详细介绍了电梯管理系统的核心代码实现,包括面向对象设计、多线程与timer控件的运用,以及电梯运行逻辑的优化。通过案例分析,阐述了需求分析的重要性及多线程编程在实际应用中的挑战与解决方案。

小组成员:汪洋,辛垧

在项目的需求分析做好的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.123.123.133.14上午3.14下午3.15上午3.16上午3.16下午
汪洋对方法实现的构思写好elevator类学习多线程换掉多线程使用timer控件对控制stop,run的修改讨论电梯的控制,并提出修改 完成alpha版
辛垧写好control类多线程编程界面的设计与修改界面的完善

转载于:https://www.cnblogs.com/FakerWang/p/3603821.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值