网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
Windows下实时行式打印系统设计
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

作者: 仲光亮

  所周知,Windows系统的页式打印系统有许多好的特性,比如所见即所得、设备无关等等。但是,在一些实时性要求很高的工业控制系统中,需要将系统随机出现的信息实时地打印出来,要求来一行打一行,而不能来一行打一页,而Windows系统的页式打印系统却很难满足这样的应用需求。鉴于这个原因,为了满足实时系统的打印要求,有必要设计一个新的实时行式打印系统。下面详细介绍如何在Windows 2000/NT上实现这样一个系统。

总体设计

实时系统的基本要求是实时性。本文采用以共享内存为中转的打印假脱机技术,所有的打印操作在内存中提交完成,保证了应用系统对打印操作的及时响应。



另一要求是设备无关性,使提交打印的操作尽可能地做到与设备无关。程序不会因为打印机设备的不同,导致程序有较大的修改。如果打印机不同,只需加载相应的打印驱动程序即可。

总体上实时行式打印系统的设计分为两个部分,一个是以内存为基础的打印假脱机部分的设计;另一个是实时打印驱动层部分的设计。系统的概要设计图如下:

实时行打印假脱机部分

这个部分的基本原理是使用一个基于共享内存技术的先入先出队列,用来存储其他应用程序提交的实时打印请求。打印进程从先入先出的环形队列取出打印请求,经过必要的处理之后,提交给打印驱动部分,由打印驱动部分负责驱动相应的打印机输出。

为满足其他应用程序提交打印请求的需要,在此使用了Windows操作系统提供的共享内存技术。共享内存是进程之间通信时用的一种技术,是一种更为标准、更为核心的技术,而且它在不同操作系统平台之间的移植性也比较好(Unix系列操作系统也有这种技术)。另一个好处是提高了实时性能,因为避免了多次内存复制的系统空间和时间上的开销。

Windows系统中与创建共享内存相关的系统函数有CreateFileMapping和MapViewOfFile。

第一个函数用来在系统中创建一块共享内存,并返回共享内存的句柄。其参数说明如下:

HANDLE WINAPI CreateFileMapping (

HANDLE hFile,

LPSECURITY _ATTRIBUTES lpsa,

DWORD dwPROTECT,

DWORD dwMaxSizeHigh,

DWORD dwMaxSizeLow,

LPCSTR lpszMapName);

hFile为文件句柄,要创建共享内存,该参数必须为0xffffffff; lpsa为安全属性结构指针; dwPROTECT是页保护标识,如PAGE_READONLY,PAGE_READWRITE等; dwMaxSizeHigh和dwMaxSizeLow共同定义了共享内存的尺寸,分别为共享内存大小的高32位和低32位; lpszMapName定义了共享内存的名字,必须确保其在系统范围内的惟一性。

第二个函数用来将创建的共享内存映射到调用进程的地址空间,并返回该地址空间的首地址。其参数说明如下:

MapViewOfFile(

HANDLE hFileMappingObject,

DWORD dwDesiredAccess,

DWORD dwFileOffsetHigh,

DWORD dwFileOffsetLow,

DWORD dwNumberOfBytesToMap);

hFileMappingObject定义了CreateFileMapping

函数返回的共享内存句柄; dwDesiredAccess定义了共享内存的访问模式,如:FILE_MAP_ALL_ACCESS

等; dwFileOffsetHigh和dwFileOffsetLow共同定义了共享内存起始位置的偏移量,分别为该偏移量的高32位和低32位,通常情况下二者都为零值; dwNumberOfBytesToMap定义了映射到本进程地址空间的共享内存的字节数,如果该值为零,则映射所有的共享内存。

这里定义实时打印系统所用共享内存的名字为g_szRealTimePrintSystemShareMemName。REALTIMEPRINT_DB是一个结构类型,定义了共享内存的内部结构,它是实时打印系统的数据核心,包括了要打印的信息、写入指针、读出指针等信息。 具体步骤如下(示意性代码):

REALTIMEPRINT_DB *g_pRealTimePrint-

SystemDb ;

HANDLE hShareMemHandle = NULL;

DWORD dwRTPSShmLen = sizeof(REALTIMEP

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号