没有合适的资源?快使用搜索试试~ 我知道了~
首页假脱机打印程序与虚拟设备
假脱机打印程序与虚拟设备
需积分: 34 52 下载量 15 浏览量
更新于2023-03-16
评论
收藏 317KB DOC 举报
利用多线程技术编写假脱机打印程序,并设计测试数据以验证程序的正确性。 1、界面要求: 程序采用简单的控制台界面,运行后在屏幕上显示功能菜单,列出该程序具有的功能,供用户选择。 2、功能要求: (1)发送打印请求; (2)查看假脱机打印队列; (3)打印文件; (4)退出。 用户选择功能后应该转到相应的处理程序,并在需要时显示程序的执行结果。 若用户选择(1)则提示用户输入待打印的文件名称,程序接收输入后将打印请求传送到打印队列中,并回到主菜单; 若用户选择(2)则在屏幕上列出打印队列情况,提示按任意键回到主界面; 若用户选择(3)则打印队首的文件,显示所打印的文件名称,按任意键回到主界面; 若用户选择(4)则退出程序的执行。
资源详情
资源评论
资源推荐
假脱机打印程序与虚拟设备
3.1 设计目的
理解虚拟设备的工作原理,理解守护程序的概念。
图 3-1 表示假脱机打印程序的工作原理。
在网络环境下,连在网络服务器上的打印机要为多个终端服务,每个终端
上的用户都可以通过客户端程序向服务器发送打印请求,服务器端的打印请求
接收程序接收来自客户端的打印请求,并将该请求存放到磁盘上的打印请求队
列中,由服务器端的假脱机打印程序在 CPU 空闲时从打印请求队列中取出请
求信息,并将文件输出到打印机中。这种工作方式不是将文件直接输出到打印
机,而是先将待打印的文件缓存到磁盘上,然后立即返回用户程序,从而缩短
了用户响应时间,为用户提供了虚拟的快速打印机。这里的磁盘缓存空间就是
虚拟设备。服务器端的打印请求接收程序和打印程序都是守护程序,即从开机
后就一直运行的程序。
3.2 设计要求
利用多线程技术编写假脱机打印程序,并设计测试数据以验证程序的正确
性。
1、界面要求:
程序采用简单的控制台界面,运行后在屏幕上显示功能菜单,列出该程序
具有的功能,供用户选择。
2、功能要求:
(1)发送打印请求;
(2)查看假脱机打印队列;
(3)打印文件;
(4)退出。
用户选择功能后应该转到相应的处理程序,并在需要时显示程序的执行结
果。
1
文件
打印
请求
打印
请求
客户端
程 序
图 3-1 假脱机程序工作原理
服务器端
打印请求队列
服务器端
打印请求
接收程序
服务器端
打印
程序
服务器端
打印机
打印
请求
若用户选择(1)则提示用户输入待打印的文件名称,程序接收输入后将
打印请求传送到打印队列中,并回到主菜单;
若用户选择(2)则在屏幕上列出打印队列情况,提示按任意键回到主界
面;
若用户选择(3)则打印队首的文件,显示所打印的文件名称,按任意键
回到主界面;
若用户选择(4)则退出程序的执行。
3.3 数据结构分析
需要两个数据结构,一个 FILE_INFO 用来描述打印请求,包括文件名称
和文件大小,如图 3-2 所示。另一个数据结构 SPOOL 用来描述打印请求队列,
如图 3-3 所示。图 3-4 描述了程序运行时刻结构体 SPOOL 的内容。
3.4 程序结构
1、线程划分
为了模拟假脱机打印程序,需要三个线程,主线程用于显示主菜单,接收
用户的功能选择,显示打印队列情况;打印请求接收/发送线程接收用户的打印
请求,并将打印请求存放到打印请求队列;打印线程用来从打印队列中取文件
并将其输出到屏幕。
2、线程互斥要求
三个线程都需要通过控制台终端与用户交互,因此对终端的使用要互斥,
以免屏幕混乱(用互斥体 h_screen_mutex 实现);三个线程都要访问打印请求
队列,因此对它要进行互斥操作(用互斥体 h_spool_mutex 实现);
3、同步要求
主线程与打印请求接收/发送线程要同步,当用户选择功能(1)时,主线
字段名称 作用
file_name
文件名称
file_size 文件大小(以 KB 为单位)
图 3-2 FILE_INFO 结构体的成员及其作用
2
字段名称 作用
spool_count 记录打印队列中的文件个数
spool_in
记录下一个打印请求存放的
位置
spool_out
记录下一个被打印文件的位
置
spool_queu
e
打 印 请 求 队 列 ( 用 数 组 实
现)
图 3-3 SPOOL 结构体的成员及其作用
spool_count 3
spool_in 3
spool_out 0
spool_queue[0
]
sever 4KB
spool_queue[1
]
client 3KB
spool_queue[2
]
myfile 7KB
spool_queue[3
]
spool_queue[4
]
图 3-4 SPOOL 结构体快照
程要通知打印请求接收/发送线程开始接收用户请求(用初始值为 0 的信号量
h_print 实现),然后主线程要等待打印请求接收/发送线程发来接收完毕的信
号(用初始值为 0 的信号量 h_sendthread_to_mainthread 实现);
主线程要与打印线程同步,当用户选择功能(3)时,主线程要通知打印
线程开始打印文件(用初始值为 0 的信号量 h_semaphore_spool 实现),然后
主 线 程 要 等 待 打 印 线 程 发 来 打 印 完 毕 的 信 号 ( 用 初 始 值 为 0 的 信 号 量
h_spoolthread_to_mainthread 实现);
(注意:在实际的系统中,打印线程不会等待用户从控制台发命令才开始
打印,而是只要有打印请求且 CPU 空闲就循环不停地打印文件,直至打印队
列为空,这时打印线程睡眠。本设计这样做是为了避免打印队列迅速变空。)
请求接收/发送线程和打印线程要同步,当打印队列为空时打印线程阻塞,
直到请求接收/发送线程将新的请求放入队列;当打印队列满时,请求接收/发
送线程阻塞,直到打印线程打印完一个文件空出新位置才能将其唤醒。这两个
线 程 的 同 步 遵 循 生 产 者 / 消 费 者 模 型 , 同 步 信 号 量 为 h_spool_empty 和
h_spool_full,前者跟踪空位置,后者跟踪打印请求。
4、函数设计
为了简化程序设计,我们只考虑单机环境,而且将打印请求队列存放在内
存中,而不是存放在磁盘中,另外用屏幕输出模拟实际的打印机输出。该程序
包括三个线程:主线程模拟客户端程序,sendthread 线程模拟打印请求接收程
序,spool_thread 线程模拟打印程序。
该程序使用以下全局变量:
spool_buffer 是 打 印 请 求 队 列 , 互 斥 体 h_spool_mutex 用 来 实 现 对
spool_buffer 的互斥访问,互斥体 h_screen_mutex 用来实现对终端的互斥访问,
h_send 和 h_spool_thread 分别是打印请求接收/发送线程和打印线程的 句柄,
h_semaphore_spool 和 h_spoolthread_to_mainthread 是主线程和打印线程之间的
同步信号量,h_print 和 h_sendthread_to_mainthread 是主线程和打印请求接收/
发送线程之间的同步信号量,h_spool_full 和 h_spool_empty 是打印线程和打印
请求接收/发送线程之间的同步信号量。
该程序共有五个函数,它们的名称及作用如图 3-5 所示。
函数名称 作用
sendthread 接收用户的打印请求并将其发送到打印请求队列中
spool_thread 从打印请求队列中取待打印文件并将其输出到屏幕上
print_space 显示若干个空格
list_spool_queue 列出打印队列
main 创建线程,初始化信号量,显示主菜单,根据用户选择执行相应功能
图 3-5 假脱机打印程序包括的函数及其作用
3
剩余11页未读,继续阅读
wasai1314
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
- MW全能培训汽轮机调节保安系统PPT教学课件.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0