基于C++ 实现处理机管理-电梯调度
♻️ 资源大小9.51MB➡️资源下载https://download.csdn.net/download/s1t16/87453220处理机管理-电梯调度操作系统 课程作业 1项目背景及需求某一层楼20层有五部互联的电梯。基于线程思想编写一个电梯调度程序。每个电梯里面设置必要功能键如数字键、关门键、开门键、上行键、下行键、报警键、当前电梯的楼层数、上升及下降状态等。每层楼的每部电梯门口应该有上行和下行按钮和当前电梯状态的数码显示器。五部电梯门口的按钮是互联结的即当一个电梯按钮按下去时其他电梯的相应按钮也就同时点亮表示也按下去了。所有电梯初始状态都在第一层。每个电梯如果在它的上层或者下层没有相应请求情况下则应该在原地保持不动。开发/运行环境环境: Windows 10 1903语言: C / MinGW x64 8.1.0 / Qt 5.12.0系统架构项目文件:└─elevator │ README.md │ ├─release │ │ elevator_sim.exe │ │ Qt5Core.dll │ │ Qt5Gui.dll │ │ Qt5Widgets.dll │ │ │ ├─platforms │ │ qwindows.dll │ │ │ └─styles │ qwindowsvistastyle.dll │ └─src building.cpp building.h building.ui elevator.cpp elevator.h elevator.ui elevator_sim.pro elevator_sim.pro.user main.cpp mainwindow.cpp mainwindow.h mainwindow.ui项目包含三个类: 主窗口类 mainwindow, 电梯类 elevator, 控制台类 building, 每个类均有自己的界面实现. 程序运行后, 实例化一个 mainwindow 类. 调整电梯与楼层的数量后, mainwindow 的 run() 方法实例化若干个 elevator 类和一个 building 类. 前者包括了电梯内部的楼层按钮与显示, 后者包括了电梯外部每一层楼的按钮以及每个电梯状态的显示.mainwindow 类程序主窗口, 继承自 QMainWindow 类Run: 运行模拟Stop: 停止模拟并销毁所有其他窗口Exit, X: 销毁所有其他窗口之后退出算法选择框: 选择外部分派算法, 共有三种算法, 在后文有详细叙述void run(); // To start simiulations. void my_stop(); // To stop simiulations.elevator 类电梯窗口, 继承自 QWidget 类每 800ms 刷新一次状态Slider: 用于指示电梯当前位置, 不可滑动. 上方标签为最大楼层, 下方标签为当前楼层.Buttons: 模拟电梯内部选择楼层的按钮, 按钮为灰色代表此楼层已按下.当前状态: 共有三种状态, 停止: P, 上升: ↑, 下降: ↓;门状态: 共有四种, Closed, Opened, Closing, Opening开门: 电梯正在运行时, 无法进行操作.void open_door(); void renew_label(); void check_when_run(); void check_when_pause(); void timer_elevator_tick(); // Run every ELEVATOR_TIMER_TICK ms. void cancel_request(int floor); // Recive task request form outside(building), and add it to destO. . // See send_request() in class building. bool recive_request(bool up true, int floor 1, bool forceRecive false);building 类外部控制窗口, 模拟电梯外部的操作, 继承自 QWidget 类每 100ms 刷新一次状态Elevators: 显示所有电梯当前的状态Floor Buttons: 每一层楼的上行和下行按钮, 按钮为灰色代表此按钮已被按下.状态栏: 显示调度操作void timer_building_tick(); // Run every 0.1s. void renew_label(unsigned int i); // Main func to select elevator(s) and send task request(s) after button clicked. void ele_select_send(bool up true, int floor 1); // Caculate every elevators rating, for elevator selecting. // Only be used in the ELE_SELECT_MODE_1. int ele_rate(bool reqUp, int reqFloor, int eleFloor, int eleStatus); // See recive_request in class elevator. bool send_request(bool up true, int floor 1, elevator *ele nullptr, bool forceRecive false);调度算法内部调度算法每一个电梯内部维护两个表: int destsInside 和 int destsOutside, 分别用来储存来自内部按钮的楼层请求和来自电梯外部按钮的请求.destsInside当电梯内部的按钮被按下后, 触发事件, 将按钮代表的楼层添加进数组 int destsInside 中.destsOutside电梯不主动处理外部按钮的事件, 而是以被动的形式接收外部的请求. 对于每一个外部的按钮按下事件, 用一个组合 [是否上行, 楼层] 来记录此任务. 例如按下四楼上行按钮, 则产生任务 [true, 4]. building 类负责将此任务分配给特定的电梯(下一节叙述这部分).电梯类拥有一个方法 void recive_request(), 这个方法接收三个参数 bool up true, int floor 1, bool forceRecive false. 这个方法用于接受外界的任务请求, 前两个参数描述了该任务, 而第三个参数决定是否强制此方法接受任务.elevator 收到任务后, 首先进行判断. 在不强制电梯接受任务 (forceRecive false) 的前提下如果任务请求和电梯状态均为上行, 且电梯当前在该楼层之上或者任务请求和电梯状态均为下行, 且电梯当前在该楼层之下时, 电梯拒绝该请求, 并返回 false.如果电梯接收任务, 会继续判断该任务是否已经在任务列表 destsOutside 中, 如果不在, 则向 destsOutside 中添加此任务. 添加完成后, 临时添加一次电梯的状态检查 (避免添加任务后等待轮询函数的状态检查带来的滞后).timer_elevator_tick()电梯类有 void timer_elevator_tick(); 方法, 每 800ms 被触发器 timer 触发一次. 这个实现两个功能, 更新电梯状态, 修改 currentFloor. 之后根据电梯状态调用不同的检查函数 check_when_run() 或 check_when_pause().check_when_run() 和 check_when_pause()这两个方法负责检查电梯状态. 首先合并 destsInsider 和 destsOutsider 得到 dests. 之后判断电梯当前是否已经到达目的地, 如是, 则从对应的列表中删掉该任务. 之后分别判断并更新状态:停止状态:电梯当前位置是否有任务在电梯当前位置之上是否有任务在电梯当前位置之上电梯行为以上上升 ↑以上上升 ↑以上下降 ↓以上不变 P以下下降 ↓以下下降 ↓以下上升 ↑以下不变 P运行状态:电梯当前状态是否有任务在电梯当前位置之上是否有任务在电梯当前位置之上电梯行为上升 ↑不变 ↑上升 ↑不变 ↑上升 ↑下降 ↓上升 ↑停止 P下降 ↓不变 ↓下降 ↓不变 ↓下降 ↓上升 ↑下降 ↓停止 Pcancel_request(int floor)这个函数是 dests 分为两个的原因.这个函数可以供外部调用, 用于撤销任务请求.内部调度实现这部分代码见文件 elevator.cpp 81-173行.外部调度算法外部调度在类 building 中实现, 用于外部的任务的分配.bool send_request()这个方法用于实现与 elevator::recive_request() 的对接.int ele_rate()这个函数用于实现对电梯进行评分, 接受四个参数: bool reqUp (请求是否是上行), int reqFloor (请求的楼层), int eleFloor (电梯楼层), int eleStatus (电梯状态).电梯的评分由两部分构成: distanceRating (60%) 和 statusRating (40%).distanceRating电梯位置distanRating电梯与请求楼层相同10000电梯与请求楼层不同statusRating首先, 如果电梯停止中, 就将 distanceRating 乘以 3.电梯状态请求类型eleFloor ? reqFloorstatusRating停止\1.0上升上升1.00.2下降0.60.4下降上升1.00.2下降0.60.4源码:statusRating eleStatus 0 ? 1.0 : reqUp ? eleStatus 1 ? eleFloor reqFloor ? 1.0 : 0.2 : eleFloor reqFloor ? 0.6 : 0.4 : eleStatus 2 ? eleFloor reqFloor ? 1.0 : 0.2 : eleFloor reqFloor ? 0.6 : 0.4;假设有一个请求在8楼, 上行. 此时的电梯有四种运行状态和一种停止状态, 且这四种状态是轮换的:如果规定停止是状态 ⑤, 显然这五种状态的优劣: ⑤ ① ③ ④ ②. 据此得到上面的表格.ele_select_send()building 有三种任务分派算法:优先级调度根据请求, 计算每个电梯的分数, 排序, 得到次序表.向次序表的第一个电梯发送请求, 如果被拒绝, 则放弃此电梯, 并向下一个电梯发送请求.重复步骤2, 直到请求被某个电梯接受, 退出算法.如果请求被所有电梯拒绝, 则强制命令次序表的第一个电梯接受任务.退出算法.随机分派全部响应调度将任务分配给所有电梯.如果有电梯已经到达, 则向其他电梯取消请求.这种电梯适用于突发人流量大时. eg. 图书馆里的人大多聚集在9-11楼, 在闭馆时大量请求发生于9-11楼, 可以采用这种方式.外部调度实现见 building.cpp 83-135 行.其他内部调度算法需要优化加入测试模式: 随机生成 1000 个人, 用于检测算法的性能.

相关新闻

C++二维数组编程实战:解析“鲜花方阵”算法与调试技巧

C++二维数组编程实战:解析“鲜花方阵”算法与调试技巧

1. 项目概述与核心思路 “鲜花方阵”这个名字听起来挺有意思,乍一看可能以为是个图形或者游戏项目,但在编程竞赛的语境里,尤其是结合“1327: 【入门】”这个编号,它几乎可以确定是一道经典的二维数组操作题。这类题目通常不涉及复…

2026/7/31 10:36:28 阅读更多 →
Unity游戏开发:基于Excel与JSON实现敌人属性动态管理与存档

Unity游戏开发:基于Excel与JSON实现敌人属性动态管理与存档

1. 项目概述:为什么要在Unity里用Excel管理敌人属性? 做游戏开发,尤其是中小型项目,最头疼的事情之一就是数据管理。策划同学今天说“我们把哥布林的攻击力从15调到18吧”,明天又说“给所有Boss的血量统一加个20%的护盾…

2026/7/31 10:36:28 阅读更多 →
2026年将至,目前市面上到底哪家语音智能护眼灯品牌才真正靠谱?

2026年将至,目前市面上到底哪家语音智能护眼灯品牌才真正靠谱?

在当今注重健康和科技的时代,护眼灯成为了众多消费者的刚需产品。尤其是语音智能护眼灯,它不仅能提供良好的照明,还能通过智能功能为用户带来更便捷的体验。然而,市场上品牌众多,让人眼花缭乱。今天,我们就…

2026/7/31 10:36:27 阅读更多 →

最新新闻

SPT-AKI存档修改器终极指南:5分钟掌握离线版塔科夫数据管理技巧

SPT-AKI存档修改器终极指南:5分钟掌握离线版塔科夫数据管理技巧

SPT-AKI存档修改器终极指南:5分钟掌握离线版塔科夫数据管理技巧 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_…

2026/7/31 11:19:42 阅读更多 →
AI评分系统偏好分析及优化策略

AI评分系统偏好分析及优化策略

1. 项目背景:当AI成为评委时的偏好现象去年Adobe研究院发布的一项实验结果在学术界引发了持续讨论:他们训练的大语言模型(LLM)评分系统在双盲测试中,竟对AI生成文本给出了系统性高于人类创作的评分。这个发现像投入平静…

2026/7/31 11:19:42 阅读更多 →
Python TCP编程实战:从基础到健壮网络通信框架构建

Python TCP编程实战:从基础到健壮网络通信框架构建

在网络编程的世界里,TCP协议就像一座连接不同设备的桥梁,而Python则是建造这座桥梁最顺手的工具之一。很多开发者以为TCP编程很复杂,需要掌握大量底层知识,但实际上Python的socket模块已经封装了大部分繁琐细节,让初学…

2026/7/31 11:19:42 阅读更多 →
ESP32固件烧录全攻略:从核心概念到实战避坑

ESP32固件烧录全攻略:从核心概念到实战避坑

1. 项目概述:从零开始认识ESP32固件烧录如果你刚拿到一块ESP32开发板,看着它上面闪烁的指示灯,心里琢磨着“我该怎么让它跑起来?”,那么恭喜你,找对地方了。固件烧录,就是把你写好的程序代码&am…

2026/7/31 11:19:41 阅读更多 →
中小企业业财数据为什么对不上?从主数据、接口到凭证规则的落地方法

中小企业业财数据为什么对不上?从主数据、接口到凭证规则的落地方法

业务数据与财务数据对不上,通常不是某一个岗位录错了数据,而是同一业务事件在不同系统中使用了不同的编码、时点、状态和核算规则。业财一体化的目标也不只是“自动生成凭证”,而是让业务单据、库存变化、应收应付和总账结果能够按统一规则关…

2026/7/31 11:19:41 阅读更多 →
STM32开发入门:从环境搭建到核心外设实战避坑指南

STM32开发入门:从环境搭建到核心外设实战避坑指南

1. 从零到一:为什么是STM32? 如果你刚接触嵌入式开发,或者从51单片机、Arduino转过来,面对STM32这个庞然大物,第一感觉可能是“复杂”。寄存器、时钟树、HAL库、CubeMX……一堆新名词扑面而来。别慌,这种感…

2026/7/31 11:18:41 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻