电梯多线程调度——最终版详细设计
——小组成员:何晓楠,刘铸辉
1.时间进度表
|
时间 |
3.10-3.12 |
3.12 |
3.13 |
3.14上午 |
3.14下午 |
3.15上午 |
3.16上午 |
3.16下午 |
3.17 |
3.18-3.19 |
3.20 |
|
何晓楠 |
通过查阅资料和视频学习C#界面制作和多线程的处理 |
编写elevator类和 ElevatorController类 |
设计电梯界面 |
研究多线程的实例,编写电梯开关门,内部外部按钮事件 |
把我们做的代码和界面进行整合 |
讨论电梯调度的优化问题,并进行单元测试,设置测试用例 |
界面的完善 |
完成alpha版 |
和其他组讨论载重限制问题,并尝试我们的设想 |
载重与出入功能的界面设计 |
编写载重功能测试用例 |
|
刘铸辉 |
添加事件代码 |
界面的设计与修改 |
优化部分方法 |
编写出入人数和载重限制的代码 |
完成最终版 |
经过几天的奋战,我们终于完成了最终版。
2.电梯说明
1.电梯内部视图 1~20为相应的楼层。 按下即可响应相应楼层,按下后变成红色即被响应;
2.最右边是楼层示意图,当电梯到达相应楼层后,红色的响应就会取消,会有关门图片变为开门图片;
3.中间外部的38个按钮(4部电梯共享此按钮),△表示向上请求,▽表示向下请求;
4.最上面的电梯运行参数设置,是设置每台电梯运行速度,载重限制,上下人数是否正常运行等参数的;
下面是整个界面:
3.程序设计图
3.1电梯状态转移图
4.程序关键实现思想
4.1多线程调度
在这里我们用的C#多线程Thread方法进行调度。下面用具体过程介绍在电梯中C#多线程的用法。
当外部请求按下4楼向上的请求时
1。程序首先初始化所有按钮及四部电梯,然后调用电梯调度类ElevatorController中upOrDown方法,判断是内部请求还是外部请求,以及是上楼还是下楼,此时是外部,上请求然后当前面板被显示为红色。
2.此时判断电梯是否在执行任务,发现电梯1未执行任务,初始化多线程Thread类,调用ThreadStart方法启动线程1。关键代码如下:
1 /// <summary> 2 /// 操作电梯判断 3 /// </summary> 4 /// <param name="BiaoJi">标记选择</param> 5 /// <param name="type">响应类型</param> 6 /// <param name="select">选择哪一个类型</param> 7 public void upOrDown(int BiaoJi, int type, int select) 8 { 9 if (BiaoJi == INTERIOR) 10 { 11 if (type == ELE1) 12 { 13 ele_1.setPanel(select); 14 } 15 else if (type == ELE2) 16 { 17 ele_2.setPanel(select); 18 } 19 else if (type == ELE3) 20 { 21 ele_3.setPanel(select); 22 } 23 else if (type == ELE4) 24 { 25 ele_4.setPanel(select); 26 } 27 else 28 { 29 Exception ex = new Exception("电梯类型出错!"); 30 throw ex; 31 } 32 } 33 else if (BiaoJi == EXTERIOR) 34 { 35 if (type == UP) 36 { 37 uppanel[select] = true; 38 } 39 else if (type == DOWN) 40 { 41 downpanel[select] = true; 42 } 43 else 44 { 45 Exception ex = new Exception("EXTERIOR type 错误"); 46 throw ex; 47 } 48 } 49 else 50 { 51 Exception ex = new Exception("BiaoJi错误"); 52 throw ex; 53 } 54 55 //判断电梯是否在执行任务 56 if (!ele_1.nowrun) 57 { 58 ele_1.nowrun = true; 59 Thread th1 = new Thread(new ThreadStart(run_ele1)); 60 th1.IsBackground = true; 61 th1.Start(); 62 } 63 else if (!ele_2.nowrun) 64 { 65 ele_2.nowrun = true; 66 Thread th2 = new Thread(new ThreadStart(run_ele2)); 67 th2.IsBackground = true; 68 th2.Start(); 69 } 70 else if (!ele_3.nowrun) 71 { 72 ele_3.nowrun = true; 73 Thread th3 = new Thread(new ThreadStart(run_ele3)); 74 th3.IsBackground = true; 75 th3.Start(); 76 } 77 else if (!ele_4.nowrun) 78 { 79 ele_4.nowrun = true; 80 Thread th4 = new Thread(new ThreadStart(run_ele4)); 81 th4.IsBackground = true; 82 th4.Start(); 83 } 84 }