医院触摸屏查询系统.docx_第1页
医院触摸屏查询系统.docx_第2页
医院触摸屏查询系统.docx_第3页
医院触摸屏查询系统.docx_第4页
医院触摸屏查询系统.docx_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

青岛理工大学综合课程设计报告院(系): 计算机工程学院 专业: 软件工程 学生姓名及学号:徐玉强 葛起龙 齐威 200907194 班级: 软件091班 题目: 触摸屏查询系统 起迄日期: 2012.12.15 2013.1.1 设计地点: 现在教育大楼 指导教师: 王成刚 2012-2013年度 第1学期完成日期: 2013年1月1日一、 课程设计目的1、掌握独占设备的分配流程,会使用安全性算法检查设备分配是否安全2、在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。二、 课程设计内容与要求 1) 合理设计SDT、DCT、COCT、CHCT的数据结构2) 独占设备、控制器与通道的数目可在界面进行设置3) 进程申请使用独占设备时至少要求包括申请时间与使用时间4) 可读取样例数据(要求存放在外部文件中)进行独占设备、控制器与通道数目的初始化,进行进程申请设备的初始化5) 点击开始运行后,系统自动根据初始设定的数据进行设备分配与回收,所有状态信息需动态地显示出来:设备、控制器、通道数目,阻塞队列情况等6) 运行中可动态增加申请设备的进程,可随时暂停,查看当前状态7) 使用可视化界面进行演示模拟一种多任务(或多用户)(多道)批处理操作系统(包含处理器管理、存储管理、文件管理、进程管理、设备管理、作业管理)。三、 系统分析与设计1、系统分析为实现独立设备的分配与回收,需要设计系统设备表(SDT)、设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)等数据结构。进行设备分配时,先查找SDT,从中找出DCT,再根据DCT中的设备状态字段,可知设备是否正忙。若忙,便将请求I/O进程挂在该设备的等待队列上,否则,将该设备分配给进程。采用多通路的方式分配控制器和通道,因此当设备分配给请求I/O的进程后,查找是否有空余控制器,若有,则将该控制器分配给进程,否则将请求I/O进程挂在控制器等待队列上。若通道有空余,将通道分配给请求的I/O进程,否则,将请求I/O进程挂在通道等待队列上。只有当设备、控制器和通道三者都分配成功时,设备分配才成功,然后,便可启动该I/O设备进行数据传送。设备分配算法:先来先服务。按照诸进程对设备请求的先后次序将程序挂在等待队列上。采用安全分配方式:每当进程发出I/O请求后,便进入阻塞状态,知道其I/O操作完成。 2、系统设计按照题目要求,本系统需要以下几个模块主界面暂停与继续执行运行初始化添加进程2.1、模块设计开始主界面初始化控制器数目和通道数目读取进程运行文件运行暂停添加进程所有进程暂停修改文件分配设备继续回收设备结束图1、主进程流程图读入文件将文件内容存入二维数组将进程添加在文件末尾添加进程计算各设备的进程总运行时间图2、读取进程申请文件若某进程i提出了I/O请求,便可按照下述步骤进行设备分配。分配包括分配设备、分配控制器和分配通道。设备分配流程如图,设备分配时安全性检查是指检查是否因设备分配而引起死锁。进程i请求I/O搜索与DCT表相连的COCT表控制器忙进程i等待控制器查找SDT表找到DCT对象控制器不忙分配控制器给进程iDCT对象忙按分配策略进入等待I/O队列DCT对象不忙搜索与COCT表相连的CHCT分配安全按分配策略选取占用设备的进程通道忙未选中进程i进程i等待通道进程i等待设备空闲通道不忙选中进程i分配通道给进程i检查设备分配给进程i的安全性分配不安全启动I/O图3、设备分配流程图2.2、数据结构说明:系统设备表(SDT):devicetype(设备类)、diviceid(设备标识符)设备控制表(DCT):devicetype(设备类型)、deviceid(设备标识符)devicstatu(设备状态)、setdestatus(设备状态置为“忙”)setstatus()(设备状态置为“闲”)控制器控制表(COCT):controllerid(控制器标识符)、controllerstatus(控制器状态)set()(控制器状态置为“忙”)div()(控制器状态置为“闲”)通道控制器(CHCT):channelid(通道标识符)、channelstatus(通道状态)set()(通道状态置为“忙”)div()(通道状态置为“忙”)SDTdevicetypedeviceidDeviceCollectionDCTdevicetypedeviceiddevicstatusetdestatus()setstatus()LinkControllerWaitForDevicePCBWaitForControllerCOCTcontrolleridcontrollerstatus set()div()WaitForChannelLinkChannelCHCTchannelidchannelstatus set()div()图4、类图主进程类:controllercount(控制器数)、channelcount(通道数)、readtxt()读文件数据AddProcess_Click()(添加进程)、searchSDT()(查SDT表)distributedevice()(分配设备)、recycle()(回收设备)Main()controllercount;channelcountreadtxt()AddProcess_Click()searchSDT()searchDCT()distributedevice()recycle ()暂停ToolStripMenuItem_Click()运行DToolStripMenuItem_Click()初始化ToolStripMenuItem_Click()停止1ToolStripMenuItem_Click()退出ToolStripMenuItem_Click()2.3、算法流程图:Main()Init()distributedevice()recycle()DCT()COCT()CHCT()SDT()图5、函数和过程的调用关系图四、 系统测试与调试分析1、 系统测试测试内容测试名称独占设备的分配与回收程序测试目的验证独占设备的分配与回收正确性测试技术场景测试测试方法黑盒测试测试用例测试内容先来先服务进程调度测试步骤检查设备队列检查控制器队列检查通道队列测试数据设备分配过程中某时刻进程 15 20 9 10 13预期数据15 209 1013测试数据15 209 10132、 调试分析1)关于实现申请设备的进程运行时间和开始时间的问题。本程序采用了多线程的策略,在分配和回收函数中设置某个循环,通过线程将该循环延迟一定的时间运行,就可解决申请设备的进程占用设备的时间和在等待设备等待队列中等待的时间长短问题。每次运行回收函数时,将该设备等待队列中的首进程从队列中移出,将设备分配给进程。2)使用多线程策略,线程无法调用主进程的成员。解决该问题的方法是在主进程窗口中添加以下: private void Main_Load(object sender, EventArgs e) Control.CheckForIllegalCrossThreadCalls = false; 3)添加进程导致线程无法运行的问题。由于添加的进程每次都加在“DeviceManagement.txt”文件中的结尾,故每次添加进程后,将文件重新读入,对于设备的占用总时间,可设置全局变量,当申请某设备的进程添加进来后,由于行数的变化,引起总时间加上申请的进程的运行时间控制该设备的分配与回收。4)添加进程时,未防止程序读入文件的正确性,要具有容错机制,每次添加的进程要符合规范,若不符合规范要提示错误。因此,要每次输入完毕后,检查textbox和combox中的数据。五、 用户手册1、使用 Microsoft Visual Studio 2010 平台。2、使用本程序时,直接运行可执行文件 DeviceManagement.exe 即可。3、本程序的操作步骤:1)运行程序,点击初始化,即可进入控制器和通道数目设置窗口,输入正确的数据后,自动读取“DeviceManagement.txt”文件中的数据,该文件中记录进程的申请过程,记录有进程名、申请的设备名、进程开始时间和进程的运行时间,读文件中数据,即把进程的申请放入一个二维数组中,每一行记录一个进程。设置窗口、文件数据如下图。 图6、控制器、通道数目设置界面2)点击“运行”按钮,程序可动态的分配“DeviceManagement.txt”文件中的进程,按照一定的算法进行I/O分配与回收,此过程中可点击“暂停”按钮,检查进程分配是否正确,点击“继续”按钮,则进程继续执行。其中每个设备的第一个textbox表示设备的等待队列,第二个textbox表示正在占用该设备的进程。图7、进程运行界面3)程序可动态添加进程,输入正确的添加进程格式,按“添加进程”按钮,即可将新进程,写入“DeviceManagement.txt”文件中,并且可动态分配该进程。在“DeviceManagement.txt”文件结尾加入一行。 图8、进程添加界面程序运行到添加的程序:图9、添加的进程运行界面4)“停止”菜单,将所有线程结束。5)“退出”菜单,停止该程序,退出窗口。六、 程序清单/ 系统设备表类 public class SDT /设备标识符 private string deviceid; /设备类 private string type ; /构造函数 public SDT(string new_type, string new_deviceid) type = new_type; deviceid = new_deviceid; / 设备控制表类 class DCT /设备类型 private string type; /设备标识符 private string deviceid; /设备状态 private int devicestatus; /设备状态置为“忙|” public void setdevicestatus() devicestatus = 1; /设备状态置为“闲” public void setstatus() devicestatus = 0; /构造函数 public DCT(string new_deviceid,int new_devicestatus) deviceid = new_deviceid; devicestatus = new_devicestatus; /控制器控制表 class COCT /控制器状态 private int controllerstatus; /控制器标识符 private string controllerid; /控制器状态置为“忙” public void set() controllerstatus+; /控制器状态置为“闲” public void div() controllerstatus-; /返回控制器状态 public int get() return controllerstatus; /通道控制表 class CHCT /通道标识符 private string channelid; /通道状态 private int channelstatus; /通道置为“忙” public void set() channelstatus+; /通道置为“闲” public void div() channelstatus-; public int get() return channelstatus; /控制器、通道数 private static int controllercount; private static int channelcount; /系统设备表SDT private SDT keyboard = new SDT(键盘, 0); private SDT mouse = new SDT(鼠标, 1); private SDT scanistor = new SDT(扫描仪, 2); private SDT displayer = new SDT(显示器, 3); private SDT printer = new SDT(打印机, 4); /设备控制表 private DCT dct0 = new DCT(0, 0); private DCT dct1 = new DCT(1, 0); private DCT dct2 = new DCT(2, 0); private DCT dct3 = new DCT(3, 0); private DCT dct4 = new DCT(4, 0); /控制器表 private COCT controller = new COCT(); /通道表 private CHCT channel = new CHCT(); /多线程 private Thread distribute; private Thread rcyk; private Thread rcym; private Thread rcys; private Thread rcyd; private Thread rcyp; /读文件 private static string lines = File.ReadAllLines(devicemanagement.txt, Encoding.Default); private static string, data = new stringlines.Length, 4; private static int m,x; /读取文件数据 public void readtxt() /将文件内容读入二维数组中 for (int i = 0; i lines.Length; i+) string str = linesi.Split( ); for (int j = 0; j 4; j+) datai, j = strj; /检查是否添加进程,并计算每个线程运行的时间 for (; x lines.Length; x+) /计算每个线程运行的时间 if (datax, 1.ToString() = 键盘) timek = timek + Convert.ToInt32(datax, 3); if (datax, 1.ToString() = 鼠标) timem = timem + Convert.ToInt32(datax, 3); if (datax, 1.ToString() = 扫描仪) times = times + Convert.ToInt32(datax, 3); if (datax, 1.ToString() = 显示器) timed = timed + Convert.ToInt32(datax, 3); if (datax, 1.ToString() = 打印机) timep = timep + Convert.ToInt32(datax, 3); /添加进程 private void AddProcess_Click(object sender, EventArgs e) string time = txttime.Text.Trim(); string starttime = txtstart.Text.Trim(); int tstatus, deviceIndex, sstatus; deviceIndex = cmbdevice.SelectedIndex; /添加进程 StreamWriter add = File.AppendText(devicemanagement.txt); /要写入的字符串 string addstring = txtname.Text.Trim() + + cmbdevice.Text + + starttime + + time; /将字符串写入文件中 add.WriteLine(addstring); add.Flush(); add.Close(); /重新读取文件数据 lines = File.ReadAllLines(devicemanagement.txt, Encoding.Default); data = new stringlines.Length, 4; this.readtxt(); /子进程可调用主进程模块 private void Main_Load(object sender, EventArgs e) Control.CheckForIllegalCrossThreadCalls = false; /设置控制器和通道数 private void button1_Click(object sender, EventArgs e) /初始化控制器数和通道数 con = txtControl.Text.Trim(); can = txtCannel.Text.Trim(); int costatus, castatus; /判断正确的控制器数 if (!int.TryParse(con, out costatus) | Convert.ToInt32(con) 1) MessageBox.Show(请输入正确的控制器数); return; /判断正确的通道数 if (!int.TryParse(can, out castatus) | Convert.ToInt32(can) 1) MessageBox.Show(请输入正确的通道数); return; /修改状态位 this.status = 1; /关闭窗口 this.Hide(); /查SDT表 private void searchSDT() /二维数组未处理完 if (m lines.Length) /查找数组第二列的申请设备名 if (datam, 1 = keyboard.gettype) /根据申请的设备名,得到设备标识符 idd = Convert.ToInt32(keyboard.getdeviceid); else if (datam, 1 = mouse.gettype) idd = Convert.ToInt32(mouse.getdeviceid); else if (datam, 1 = scanistor.gettype) idd = Convert.ToInt32(scanistor.getdeviceid); if (datam, 1 = displayer.gettype) idd = Convert.ToInt32(displayer.getdeviceid); else if (datam, 1 = printer.gettype) idd = Convert.ToInt32(printer.getdeviceid); /查DCT表 private void searchDCT() /根据设备的标识符,得到该设备的状态 switch (idd) case 0: dstatus0 = dct0.getdevicestatus; break; case 1: dstatus1 = dct1.getdevicestatus; break; case 2: dstatus2 = dct2.getdevicestatus; break; case 3: dstatus3 = dct3.getdevicestatus; break; case 4: dstatus4 = dct4.getdevicestatus; break; /分配设备 private void distributedevice() /二维数组数据为读完 for (m = 0; m lines.Length; m+) /查SDT表 this.searchSDT(); /定义延迟时间,即二维数组第3列数据 int time = Convert.ToInt32(datam, 2); time = time * 1000; /该进程延时运行 Thread.Sleep(time); /根据得到的设备标识符检查设备状态 switch (idd) case 0: if (dstatus0 = 1) /键盘设备“忙”,将进程添加到等待队列中 /将二维数组的第1列为“键盘”的数据存入键盘设备等待队列中 kq.Enqueue(datam, 0); /将二维数组第4列数据存入键盘的设备运行时间队列中 kqt.Enqueue(datam, 3); string ks = ; if (kq.Count = 0) ks = ks + 闲; /取出等待队列中的各个数据 for (int k = 0; k kq.Count; k+) string ke = kq.Dequeue().ToString(); ks = ks + ke + ; kq.Enqueue(ke); /显示等待队列中的各个数据 textk1.Text = ks; break; case 1: if (dstatus1 = 1) /鼠标设备 break; case 2: if (dstatus2 = 1) /扫描仪设备 break; case 3: if (dstatus3 = 1) /显示器设备 break; case 4: if (dstatus4 = 1) /打印机设备 break; default: break; /回收设备 private void recycle() int s1 = 0; string process = 闲; int t=0; int sum = 0; /检查申请该设备的进程总运行时间 while(sum=time) /正在运行的进程数目 if (controller.get() = channelcount & channel.get() 0) /取设备等待队列首进程名 process = q.Dequeue().ToString(); c.Push(process); this.write(); for (int k = 0; k 0) /取进程运行时间 t = Convert.ToInt32(qt.Dequeue(); /计算已占用设备的时间 sum = sum + t; textk.Text = process; if (q.Count = 0) s = s + 空; textk.Text = s; int time; if (s1 = 0) time = 100; s = 1; else time = Convert.ToInt32(t) * 1000; /进程运行的延迟时间 Thread.Sleep(time); /占用设备达到总运行时间,停止回收 if (sum = time) count+; break; /计算已运行完设备的数目 pps+; process = 闲; textk.Text = process; 七、 体会与自我评价通过这次操作系统课程设计,我加深了设备分配的理解,明白了独占设备分配的查表顺序,及各个表格中的联系,对于各个表中的数据结构,代表的含义,在设备分配中起的作用都有了清晰地理解。系统在分配设备时,考虑多种因素,包括设备的固有属性

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论