续电梯调度(二)
李帅---张硕
对开始思路进行修改,使用四个线程(即多线程)来代替四部电梯实例,首先解释一下多线程,多线程指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程以完成各自的任务。通过对线程的运行,启动和挂起来实现对电梯的调度。下面是定义的一些变量:
int[] flag ---请求上下楼的标志,初始为0,上楼为1,下楼为-1;
int[] ele_flag---电梯运行标志,初始为0,上楼为1,下楼为-1;
int[] num---电梯所在楼层;
int[] floortop = new int[4]---要到达的最高楼层;
int[] floorbase = new int[4]---要到达的最低楼层;
int obj---中间变量发出请求的标志;
int[] obj_num---发出请求的楼层个数;
int[ ,] floor_num = new int[4,21]---电梯所要到达的楼层;
Thread ele1, ele2, ele3, ele4---四部电梯运行的线程实例;
下面是调度的主要算法:
1 public void start() 2 { 3 4 int min = 22, d; 5 int select = -1; 6 if (floor_num[floor, floory] < floorbase[floor] && floor_num[floor, floory]>0) 7 { 8 floorbase[floor] = floor_num[floor,floory]; 9 } 10 if (floortop[floor] < floor_num[floor,floory]) 11 { 12 floortop[floor] = floor_num[floor,floory]; 13 } 14 if (floor_num[0, obj] == -1 && floor_num[1, obj] == -1 && floor_num[2, obj] == -1 && floor_num[3, obj] == -1) //发出请求的楼层未在等待中 15 { 16 for (int i = 0; i < 4; i++) 17 { 18 19 if (ele_flag[i] == 0) //电梯停靠 20 { 21 22 d = Math.Abs(obj - num[i]); //电梯与发出请求的楼层的距离 23 //找出最短距离的电梯,将距离最近的电梯号赋给select 24 if (min > d) 25 { 26 min = d; 27 select = i; 28 if (obj < num[i]) 29 { 30 ele_flag[i] = -1; 31 } 32 if (obj > num[i]) 33 { 34 35 ele_flag[i] = 1; 36 } 37 if (obj == num[i]) 38 { 39 40 ele_flag[i] = 0; 41 } 42 } 43 44 } 45 if (ele_flag[i] == 1 && flag[obj] == 1) //电梯向上运行与请求同向 46 { 47 flag[obj] = 0; 48 if (obj >= num[i]) 49 { 50 d = Math.Abs(obj - num[i]); //电梯与发出请求的楼层的距离 51 //找出最短距离的电梯,将距离最近的电梯号赋给select 52 if (min > d) 53 { 54 55 min = d; 56 select = i; 57 ele_flag[i] = 1; 58 } 59 } 60 if (obj < num[i] && min == 22) 61 { 62 63 button_Click(); 64 } 65 66 } 67 if (ele_flag[i] == -1 && flag[obj] == -1) //电梯下降 68 { 69 flag[obj] = 0; 70 if (obj <= num[i]) 71 { 72 d = Math.Abs(obj - num[i]); //电梯与发出请求的楼层的距离 73 d = Math.Abs(obj - num[i]); 74 //找出最短距离的电梯,将距离最近的电梯号赋给select 75 if (min > d) 76 { 77 min = d; 78 select = i; 79 ele_flag[i] = -1; 80 81 } 82 } 83 if (obj > num[i] && min == 22) 84 { 85 86 button_Click(); 87 } 88 } 89 90 } 91 } 92 if (select == 0) 93 { 94 obj_num[select]++; 95 floor_num[0,obj] = obj; 96 if (ele_flag[0] == 1 && obj > floortop[select]) 97 { 98 floortop[select] = obj; 99 } 100 if(obj_num[select]==1) 101 { 102 103 ele1 = new Thread(new ThreadStart(run1)); 104 ele1.Start(); 105 } 106 } 107 if (select == 1) 108 { 109 obj_num[select]++; 110 floor_num[1,obj] = obj; 111 if (ele_flag[0] == 1 && obj > floortop[select]) 112 { 113 floortop[select] = obj; 114 } 115 if (obj_num[select] == 1) 116 { 117 ele2 = new Thread(new ThreadStart(run2)); 118 ele2.Start(); 119 } 120 } 121 if (select == 2) 122 { 123 obj_num[select]++; 124 floor_num[2,obj] = obj; 125 if (ele_flag[0] == 1 && obj > floortop[select]) 126 { 127 floortop[select] = obj; 128 } 129 if (obj_num[select] == 1) 130 { 131 ele3 = new Thread(new ThreadStart(run3)); 132 ele3.Start(); 133 } 134 } 135 if (select == 3) 136 { 137 obj_num[select]++; 138 floor_num[3,obj] = obj; 139 if (ele_flag[0] == 1 && obj > floortop[select]) 140 { 141 floortop[select] = obj; 142 } 143 if (obj_num[select] == 1) 144 { 145 ele4 = new Thread(new ThreadStart(run4)); 146 ele4.Start(); 147 } 148 } 149 150 151 }
另附截图一张:
完美的实现还在设计之中。。。
小组成员 | 2014.3.13 | 2014.3.14 | 2014.3.15 | 2014.3.16 |
李帅 | 19:21-20:30 对周一电梯实地考察的结果进行了分析,确定了原来的一些不确定因素,比如说电梯向上运行若到达某层时会不会响应向下的请求等,在网上查阅了资料,决定采用线程来解决问题 | 16:20-17:43对线程进行学习, 并向同学请教相关问题 |
12:20-13:10对最初的代码进行交流,由于某些原因转战回宿舍,对局部代码进行测试以及修改 16:07—17:25充当驾驶员的角色对函数进行修改以及测试 | 09:20-11:23对各部分函数进行测试以及修改 |
张硕 | 14:30-16:00查阅书籍查看线程的属性以及相关函数,并对李帅先前设计的界面初稿进行审阅。 | 12:20-13:10对最初的代码进行交流,由于某些原因转战回宿舍,对电梯外部函数进行设计。 16:07-17:25 充当领航员对李帅同学的代码进行挑错处理18:47-21:45进行界面的设计,对各个部件的布局做到良好的调整,使界面看着更舒服。 | 19:50-20:39,完成博客 的发表 |