用多线程,编写一个电梯调度程序。很急,请大家帮忙。(200分)

  • 主题发起人 主题发起人 jlxbz
  • 开始时间 开始时间
J

jlxbz

Unregistered / Unconfirmed
GUEST, unregistred user!
使用线程的思想,编写一个电梯调度程序。
具体描述及要求如下:
假设有一栋楼10层,有3部互联的电梯
1) 初始状态:所有电梯都在一层。
2) 每一个电梯如果没有相应的请求(上或下),则应该停在原地保持不动,也就是说每一个电梯静止时不一定都在两头。
3) 每一层,每一部电梯的外面都应当有两个按钮(上、下)以及一个状态显示器(显示电梯此时的状态——上/下,目前所在楼层数)。
4) 每一个电梯里面应该有一组数字按钮(1-10)及一个状态显示器(显示电梯此时的状态——上/下,目前所在楼层数),电梯的开、关门由电梯自动控制(开门时间为2秒),并设每层所有人员在2秒内均能全部进入电梯,电梯的载客人数不限。
5) 3部电梯门口的按钮是互相联结的,当一个电梯的按钮按下去,其他电梯的相应按钮也就同时点亮,表示也按下去了。调度算法根据这五部电梯的状态寻找离当前楼层最近的并且和请求同方向的电梯给予响应。如果在调度过程中出现多部(2部或3部)电梯同时满足调度条件,则随机选择一个予以调度。
提示:
1) 本程序其实还是一个仿真题目,因此最适合用面向对象的编程语言编写。
2) 首先应当考虑清楚应当使用几个线程(我想至少要4个),以及每个线程的功能(功能划分应当清楚明晰、不要纠缠不清),还有就是什么情况需要同步,什么情况下需要互斥,以及如何实现(使用锁,还是信号量),注意临界资源可以是:变量、数组、栈、队列、链表等等,不要局限。
3) 电梯的具体运行应当由每部电梯自己控制,但如何运行(如方向等)要受调度程序的控制,此外电梯应当在运行过程中不断更新自己的状态。
大家看一看帮忙设计一下,有实现的代码当然更好。东西要的很急。
我的邮箱:jlxbz@sina.com
 
干吗非用线程才能解决?
 
梯内比梯外优先,以运行距离最小的方式来响应梯外乘客的请求
 
两个线程也可以,一个更新界面,一个轮循三部电梯
 
很像一个面试题目!
 
用不着多线程
 
www.2ccc.com里有一个类似的电梯仿真程序还带有设计文档。
 
要两个线程,界面不算.
1.StairsThread: 每个电梯一个线程,维护自己的 level 和方向.
2.WorkerThread: 工作线程一个,负责仲裁用户的请求.需要和电梯线程通讯.
//数据结构定义.
type Stairs
Level:Integer;
// 楼层
Direct:Integer;//运行方向
ID:Integer;
//电梯的编号
end;

//用户请求定义:
Type Request
Level:Integer;
//楼层
Direct:Integer;//方向 上或下
end;

1.StairsThread: 每个电梯一个线程,维护自己的 level 和方向.
class StairsThread = TThread;
Private
FLevel://设置当前的楼层.
FDirect://当前的运行方向.
FRequestlist: //电梯内部的请求,在某层停.上或下. 原则是一个方向的请求都执行完了 才去处理另外的方向的请求.
Public
Execute;// 电梯运行体
{描述: While Not Terminateddo

if 内部没有人 then
停止.
if 仲裁通知在 X Level then
在 加入内部任务列表 (X level 停一下)
调整任务列表的优先顺序:(按方向和楼层顺序)
}
2.WorkerThread: 工作线程一个,负责仲裁用户的请求.需要和电梯线程通讯.
class WorkerThread = TThread
Private
FRequsetList:Tlist;//用户的请求.有界面输入.
Public
Execute;//仲裁线程执行体.
{
调整FrequestList的用户的请求的优先顺序:根据方向排序.
for i:= 0 to 请求数量 -1do

begin

BroadCast('用户请求',所有的电梯); //电梯接收消息,给出完成的最大耗费,包括转向)
根据电梯的返回,选择一个发送确认,;//电梯收到确认的命令后,会自己搜索任务,在制定的楼层停止!
end;
}
要是可以画图就好了!
 
不用编了,看看这个:
http://www.2ccc.com/article.asp?articleid=217
 
接受答案了.
 
后退
顶部