电梯调度(三)

续电梯调度(二)

                                                                                                                                                                                                  李帅---张硕

      对开始思路进行修改,使用四个线程(即多线程)来代替四部电梯实例,首先解释一下多线程,多线程指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程以完成各自的任务。通过对线程的运行,启动和挂起来实现对电梯的调度。下面是定义的一些变量:
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,完成博客
的发表
原文地址:https://www.cnblogs.com/zsjy/p/3603817.html