續電梯調度(二)
李帥---張碩
對開始思路進行修改,使用四個線程(即多線程)來代替四部電梯實例,首先解釋一下多線程,多線程指程序中包含多個執行流,即在一個程序中可以同時運行多個不同的線程來執行不同的任務,也就是說允許單個程序創建多個並行執行的線程以完成各自的任務。通過對線程的運行,啟動和掛起來實現對電梯的調度。下面是定義的一些變量:
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,完成博客 的發表 |