android电梯程序设计,课内资源 - 基于Android实现的电梯调度模拟

一、使用说明

1.1 项目简介

某一楼有20层,操作者可以通过使用5部电梯从起始楼层来到达指定的楼层。本项目通过实现电梯调度,来模拟实现操作系统的调度过程,并且学习Android环境下使用Java的多线程编程方法以及调度算法。

1.2 项目要求操作者可以在1~20层任意一层进入电梯并到达指定楼层

电梯中有一些按键供操作者使用,开门键(缩短开门时间)、关门键(缩短关门时间)、上行键、下行键(前往上层或下层)

每部电梯外部和内部有一个数码器用于显示当前电梯当前所在楼层

5部电梯相互联结,即当一个电梯按钮按下去时,其它电梯相应按钮同时点亮,表示也按下去了。所有电梯初始状态都在第一层,且每个电梯没有相应请求情况下,在原地保持不动。在电梯到达起始楼层或终点楼层时,会自动进入电梯内部,进入电梯内部后可以在电梯内部等待到达终点楼层,也可以退回到外部界面进行下次操作

电梯运行时每层楼需要1秒,开门或关门时需要5秒

1.3 操作手册

运行程序后,首先进入操作界面,即电梯外部。如图,共有5部电梯,且每部电梯有数码显示器和上下行按键。由于界面大小的限制,将电梯数字按键改为手动输入起始点和终点,位于5部电梯下方。以下只演示一部电梯的使用情况,其余电梯使用情况相同,只需根据调度算法去选择不同电梯来执行相应任务。

1.3.1 情况一:1至15层

e96620362696720616217bc87b2dab16.png

第一步,输入起始点和终点。

033fd01a344b86298daf2bf0107484db.png

第二步,点击任一上行按键可启动电梯,目前电梯状态都在初始楼层1楼且都处于静止状态,该情况下默认第一部电梯启动。当电梯到达起始点楼层时,会自动进入电梯内部。

890d2100ba5875ad9f7b96986e02b3f6.png

第三步,电梯内部的数码显示器会显示当前楼层。其中刚进入电梯时会有5秒延迟,该时间用于乘客进入电梯,可以提前点击左下方关门按钮让电梯立即启动。由于界面大小问题,无法在保证美观的前提下完全装下20个按键,因此该电梯只需在电梯外输入起始点和终点。

左上角的返回按钮可以让视角返回上一层界面观察电梯调度情况。

界面1

界面2

cdc7a3623b284f622e7c695ff4f64dec.png

8bd551d76c1ad9b0a5565183f6b6219c.png

第四步,当电梯到达指定楼层后,会有5秒延迟来打开电梯门,此时点击开门按键会立刻开门离开电梯,返回电梯操作界面。可以看到此时第一部电梯已到达15层。可以在该界面继续进行其他操作。

836ef35de92ea77bb4f351376f190735.png

1.3.2 情况二:电梯从1层前往20层时,有乘客在10层按键希望到达18层

第一步:输入起始点和终点,点击向上按键,自动进入电梯界面,电梯开始自动向上前进。

界面1

界面2

a38f541b6a826d17a7b25a0853f84273.png

c4813c64121ae95b140ca5d7c81ce24a.png

第二步:点击左上角返回按键,返回上一层,输入另一乘客的请求楼层,起始点10层,终点18层。调度算法会调用同向的第一部电梯。

19886962d691a3d3d5498fb15dce911c.png

第三步:电梯到达10层后会自动进入电梯内部,直到到达18层后会离开电梯。

ea5428a6003f1e2f0d7227113905dd99.png

第四步:电梯在将中间乘客送到指定地点后,继续前往原终点20层。

13b5e1bd7d6cea32d813374dbe13bdd1.png

1.4 注意事项输入的起始点和终点必须是1~20的数字,且在按电梯按键时该输入框不可为空,若为空会有提示。

6ff7696ac25f84963b1a4b71211f5d42.png

5部电梯会出现满负荷操作现象,即所有电梯都在运行,若此时操作过快会引起系统错误,此时会有提示禁止操作。

a9fa0a8da737e0ee4233ac7674f879b7.png

在进入电梯内部后,只有在电梯停止过程中,即乘客刚进入电梯的过程和电梯刚到终点等待乘客离开电梯时,才可以使用开门与关门键,其他时间使用电梯不会做出任何反应。

电梯可以接受多个中间请求,但同一中间请求只会有一部电梯响应。如A电梯在从1层前往20层的过程中,如果中间有乘客请求从10层到18层,A电梯会响应该请求,但如果在电梯到达10层前多次按电梯按键,其他电梯不会做出任何反应,只有A电梯会继续前往10层。

二、概述

2.1 基本思路

该电梯调度项目所采取的电梯调度算法与操作系统中进程调度算法中的抢占式SJF调度算法类似,因为SJF调度算法对于给定的一组进程,平均等待时间最小,且抢占式SJF调度算法适用于电梯项目,在电梯上升或下降过程中,可能会出现同方向的楼层发出请求,抢占式SJF调度算法满足该现象,可以使同方向的乘客共用一部电梯。因此采用此算法作为基本思路。

根据抢占式的SJF调度算法,本项目的调度算法的基本思想为三步:

同方向上有至少一个正在赶到乘客所在楼层的电梯,选择距离最近的。根据抢占式SJF调度算法,如果后来请求的进程所需的时间更短,则提前执行该进程,当该进程执行完后,恢复原进程。电梯调度同理,在某个电梯执行某个请求时,如果后来存在该电梯同向上的请求,且电梯正在前往目标楼层时,电梯会响应该请求,并先将该乘客送往目的地后,继续执行原请求。项目中最重要的步骤为此步,严格按照抢占式SJF调度算法实现,平均等待时间最小

若没有同方向的电梯,调度距离最近的空闲电梯。这与抢占式SJF调度算法刚开始的情况相同,并没有进程需要执行,一旦有请求,立马放入执行过程中,无需等待

若既没有同方向也没有闲置的电梯,一直等待到有电梯闲置

2.2 主要文件MainActivity.class & activity_main.xml (主文件,即电梯外部操作界面)

Inner_elavator.class & inner_elavator.xml(电梯内部文件)

TextCircleView.class(数码显示器控件)

Elavator.class(电梯类,相当于进程,既包含了相应的电梯操作,也包含了操作系统中的PCB)

DeletableEditText.class(输入框控件)

三、具体实现

3.1 PCB

在该项目中引用了操作系统中PCB的概念,即进程控制块,其中包含了电梯的一些状态以及一些电梯信息:

2a8eb226b45e51a0074955d30f49dda8.png

3.2 调度算法

由于可以直接得到乘客的起点和终点,电梯可以直接判断乘客的前进方向是向上还是向下。算法中的choice为将要调用的电梯的标号,初始为-1,distance数组为各电梯距离起点的距离。根据抢占式的SJF调度算法,本项目的调度算法的基本思想为三步:

1.同方向上有至少一个正在赶到乘客所在楼层的电梯,选择距离最近的。

3047af210b6b6c04e45fe152b11b5cb8.png

根据算法要求,首先遍历五部电梯寻找同向电梯,若有同向,修改电梯距离至起始点的位置,默认情况距离为100。在此之后,对数组distance进行遍历,寻找最短距离,若有同向电梯,将该电梯标志赋给choice。若没有则证明无同向电梯,进行下一步判断空闲电梯的距离。

2.若没有同方向的电梯,调度距离最近的空闲电梯。

e23f2017bc2e7fca212018570e399ebb.png

若无同方向电梯,经过第一步后choice仍为-1,之后判断各个电梯是否空闲,若空闲则修改其至起点距离,并寻找最短距离,将其电梯标号赋给choice。

3.若既没有同方向也没有闲置的电梯,一直等待到有电梯闲置。此时choice仍为-1,只有在有电梯闲置的时候才可以接受请求。

3.3 电梯方向判断

Elavator类提供的Judge方法可以判断电梯此时的方向,并且能够将初值起点、终点、方向赋给当前电梯。

3.4 电梯执行当前位置到起点的过程

Elavator类提供的Pos_to_Start方法可以让电梯在接受到指令后,从当前位置前往目标楼层的起始点。首先判断当前是否到达指定位置,根据方向不同对该电梯的位置count进行修改,若到达指定位置,即到达起点时,进入电梯内部,转入活动Inner_elavator,同时原操作界面在电梯停止五秒后,判断此时乘客要求电梯向上还是向下,修改电梯方向值。

5dcad150f886021915ad0c0fe4225064.png

3.5 电梯调用

Elavator类中的startTimer()方法让系统可以调用该电梯。在电梯不是停止的条件下,向线程发送更新UI的消息,之后根据电梯状态,是否有被其他楼层请求,是否到达起点等情况调用不同的方法。

3.6 电梯接受其他楼层请求

Elavator类中的Add()方法实现了其他楼层可以向同向电梯发出请求并得到接受。对正在调用的电梯的midEnd、midStart进行判断,判断该电梯是否存在中间请求,若存在,电梯停止5秒,留给乘客上下行。

6b323a7f5b63d9fc9ffc6f00e9c5bcaa.png

3.7 电梯从起点到终点

Elavator类中的Start_to_End()方法实现了电梯从起点前往终点的过程。在未到达指定位置前,通过修改count来修改电梯当前位置,若到达终点后,停止5秒留给乘客离开电梯,同时判断该电梯是否仍存在中间请求,即有人在该电梯前往终点的路上进入了电梯,并选择了其他楼层作为终点,如存在则继续前往下一个终点。

3.8 电梯内部的实现

电梯内部的实现也是依靠创建一个线程。在进入电梯内部时,同时将起点、终点等信息传入该活动。

首先给1秒钟的思考时间,乘客是否需要快速关门,若关门则取消剩余的等待时间,直接开始运行。在电梯到达之前按下开门键不会有任何反应,只有当电梯到达之后,才会立即退出电梯。

70dee0a9d5eb201c7dce8c6aa943c1e1.png

四、总结

这次的项目主要是学习操作系统知识中的进程调度算法,其中涉及的知识点包括进程的创建和状态切换、PCB以及进程调度算法中的SJF调度算法。通过这次项目不仅是对操作系统中这一方面的知识点了解更深,对Android环境下的进程创建和管理有了更多的了解。

由于创建的文件是APP,受制于屏幕的大小,没有将20个数字键全部装入屏幕,而是采取了更为简便的直接输入。这与项目要求略有不符,没有把20个电梯按键全装入,因为初学Android,虽然能实现全部20个电梯按键在电梯内部的功能,但是会出现大量的重复代码(作为初学者的我认为可能需要20个监听?),而且UI做的很丑,希望助教能手下留情。

第一次使用Android和Java写有关进程的算法,项目中可能还存在一些问题,比如有时切换电梯内外时略有延迟,会造成电梯内外数据不同步的现象,而且电梯频繁的内外切换可能会影响观察数据,因为一些开关门的时间问题,很多时候会注意到关门出电梯的时候,该电梯已经前往其他有需求的楼层,这一点由于不同操作者对电梯进行操作是在内部,而外部的进程无法突然中断,所以会造成内外不同步的现象,但是这种现象算是比较少数的,比较多数的情况可能是因为进程开太多了,导致有时楼梯的数字时间是对的,但会一下走2个数字,即用2秒从1楼直接显示3楼,这个问题我不是很懂……所以没能解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net 根据当前时间计算是否股票、期货、黄金交易日期

很简单的一个方法: 股票:每周1到周五,上午9:30到11:30 下午13:00 到15:00 期货:每周1到周五,上午9:00到11:30 下午13:30到15:00 黄金:每周1到周五,上午9:00到11:30 下午13:30到15:…

android mac 照片恢复,如何找回Android手机删除的照片?这方法你肯定不知道

安卓手机怎么恢复误删的照片?如何找回Android手机照片?现在大多数人都喜欢用手机拍照存照片,慢慢的,手机中的照片自然而然就会变多,而照片是最占内存的。当你照片达到一定数量,内存快满的时候,连照片都拍不了。所以就…

nubia android root权限,获取中兴NX403a (Nubia Z5S Mini Android 4.2)ROOT权限教程,新手必看...

中兴NX403a (Nubia Z5S Mini Android 4.2)如何获取ROOT权限?用什么ROOT工具最简单?请跟着小编一起来看看如何用奇兔刷机对中兴NX403a (Nubia Z5S Mini Android 4.2)进行一键ROOT,小编特别亲手制作了详细的中兴NX403a (Nubia Z5S Mini Android 4.2) ROOT教程图解&a…

A20 编译

android 源码编译分为 2 个部分,一部分是 linux 内核编译,这部分包括 uboot,另一部分是 android 源码编译。所以编译时各自单独编译,编译成功能,最近单独打包成最终烧录的镜像文件。2.1 源码结构说明首先把源码包 A20-…

apache OFBiz的安装

去官网下载OFBiz的代码包。解压这个代码包进入到命令行,输入以下命令 ant build-all 这时候会自动进行安装。这个过程大概有10多分钟。 运行startofbiz脚本。由于我是windows,所以运行startofbiz.bat。在网址输入http://localhost:8080/ecommerce/可以…

android 沉浸栏灰色,Android 沉浸栏实践——踩坑

当前开发环境:Android Studio 2.1.3,compileSdkVersion 24,buildToolsVersion "24.0.2",support:appcompat-v7:24.2.0首先放个图,这就是我要做成的效果,Toolbar 和 Status Bar 一体共用背景图&am…

android实现文本输入,Android实现智能提示的文本输入框AutoCompleteTextView

今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个。这里我用两种不同的写法来处理。当然,无论用哪一种写法,效果都是一样的。我们先来看效果图。要实现这种效果十分简单。需要一个…

ibatis的简介与初步搭建应用

一、ibatis的简介 ibatis是什么东西就不介绍了,自己去找谷老师。 这里讲下自己的使用体会。之前自己学过Hibernate,是看尚学堂的视频教学的,看完以后发现Hibernate体系中的内容真的很多,什么N-N关联、HSQL、缓存管理等等&#xff…

VOIP,PSTN,ISDN

近来在电视、杂志特集等展露头脚的「IP电话」,因其通话费用低廉而有口皆碑。IP电话利用的IP网络在互联网的世界里是众所周知的。互联网被认为基本上是免费的网络。接下来以此开放的技术和构想作为基础而登场的就是IP电话。IP电话与构成 所谓的IP电话 所谓的IP电话就…

svn在linux下的使用(svn命令行)ubuntu 删除 新增 添加 提交 状态查询 恢复

合并步骤:(1)先切换到分支;(2)svn merge trunk . (3)svn sw trunk (4)svn merge --reintegrate branch . svn merge http://59.251.189.152:8989/svn/ron/tru…

计算机组装与维护模拟测试题三答案,春季高考信息技术模拟题3(计算机组装与维修部分含答案)...

36.计算机硬件系统的核心部件是A.主板B.CPUC.内存D.硬盘 37.北桥芯片的功能不包括A.对CPU类型和主频的支持B.对ECC纠错的支持C.对内存类型和最大容量的支持D.对USB接口的支持 38.操作…

wince6下usb摄像头(UVC)使用指南

转自:http://hi.baidu.com/cahbb/blog/item/6d76093498fe0790a61e120e.html 在搭好了wince6的开发环境之后,下一步试验一下wince6下使用摄像头的方法。搜集了不少资料,从中学习了很多有用的东西,在这给记录下来,方便…

使用SqlCommandBuilder

使用命令构造器添加行 View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient;namespace PersistAddsBuilder {class Program{static void Main(string[] args){string connStri…

Asterisk权威指南/第二章 Asterisk架构

Asterisk和其他传统的PBX完全不同,因为Asterisk的拨号计划以同样的方式处理所有的入局信道(incoming channels)。 传统的PBX在逻辑上区分工作站信道(连接电话机)和电话局信道(连接到外部世界)。…

x-lite asterisk 成功实现视频通话

首先,在此感谢asterisk协会的各位大牛们,没有他们的帮助,我也不可能在这么短的时间内实现,x-liteasterisk音视频通话。在此将实现的过程记录如下,分享给asterisk的爱好者们。 1. 修改asterisk服务器的sip.conf文件&…

axure 链接html文件,通过WuliHub免费托管原型Axure HTML文件

产品经理常用的工具就是Axure,通过Axure把想法转化成包含交互的原型线框图。在工作中,我们用HTML文件传递不仅会遇到某些浏览器无法打开的问题,而且没有办法及时更新内容。所以,介绍一种简单的并且免费的方式来方便管理HTML原型&a…

Asterisk SIP连通测试(X-Lite eyebeam)

Step1:设置 sip.conf rootUbuntu:/etc/asterisk# vim sip.conf [general] //类似与全局变量 context default srvlookup yes //DNS SRV记录查询 [111] secretaaa //密码&#xf…

html多出的空白页怎么删除,word多出一页空白页怎么删除,这4个方法总有一个能解决,真实挂机网赚项目...

信赖大多数人都碰到过这样的难题,在编辑Word文档的时刻,是不是在中心或者是最后一页,莫名其妙的泛起空白页,而且这个空白页怎么删都删不掉。不要着急,今天就给人人分享4种简朴又好用的解决方式,总有一种能让…

linq to json for sl

一.Linq to JSON是用来干什么的?Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和修改部分的数据而非反序列化全部. 二.创建JSON数组和对象在进行Linq to…

编程是一种艺术创作

软件正在吞噬世界 “软件正在吞噬世界。”——马克 安德森 马克 • 安德森 在新一轮的信息技术革命中,我们已经见证,软件对社会生产的方方面面,产生了深刻的影响,它们侵入并颠覆了已经建立起来的行业架构。越来越多的大企业和行业…