美章网 资料文库 图形显示与炮兵作战模拟系统间接口实现范文

图形显示与炮兵作战模拟系统间接口实现范文

本站小编为你精心准备了图形显示与炮兵作战模拟系统间接口实现参考范文,愿这些范文能点燃您思维的火花,激发您的写作灵感。欢迎深入阅读并收藏。

图形显示与炮兵作战模拟系统间接口实现

摘要:为了实现图形显示模块与炮兵作战模拟系统其他模块间的通信,本文通过接口技术来解决作战态势的数据表示与模拟的同步,并利用共享文件和共享内存区的方法实现数据传递。关键词:图形;接口;模拟随着炮兵作战模拟系统模拟的内容越来越多,朝着多机联网、分布式处理的方向发展,将图形显示分系统设计成一个独立的、通用的模块是很有必要的,但必须解决好图形显示分系统与其他模块的接口。1接口作用接口主要解决两个问题:作战态势的数据表示与模拟的同步。作战态势主要由下面的情况组成:一定区域的背景地图及地物、各参战单元的属性及动作、交战关系及作战效能区、播放附加媒体及声音效果。这些态势可由一种统一的数据结构表示,形成一种情况对应一种命令。命令由多个字段组成。图形模块接收到一组显示命令后,通过内部解释程序把命令转为作战态势的显示。模拟的同步是指模型机产生一组显示命令之后,只有图形机接收之后,模型机才能产生下一组显示命令,是两个执行进程问的一种互相等待的同步控制机制。例如通过网络共享文件实现命令的传送,专门设置一个信号数据,用来标志可写还是可读。当模型机接到“可写”后,写出一条命令,设置“可读”。图形机接到“可读”后,读入一条命令。设置“可写”。这样即实现了两个模块之间的同步控制机制。实际上,模块之间接口的关键是解决其间通信程序的编写。根据图形模块与其控制模块之间的位置差异,通信的方法也有所不同。2接口实现方法模块间通信属于不同进程间的通信。通常有两大方式:共享系统资源与通过操作系统来收发消息。在图形模块与其他模块的接口编程中。更多的是传递数据,而并非常用的消息。即便是需要用到传递消息,也可以用约定的数据来代替。故在此重点讨论用共享系统资源的方式进行模块间的通信。2.1共享文件的方法对于共享系统资源而言,可分为共享硬盘文件(如共享数据库,共享INI型文件,共享文本文件等)和共享内存(如共享内存映射文件,共享动态连接库控制的内存,共享串口缓冲区等)等不同方式。在一般性的,对实时性要求不高,数据交换不太频繁的进程通信中,可以借助于共享硬盘文件来实现。这种方法有编写简单,调试容易直观,适用各种编程语言的优点。最简单的可用文件是文本文件,各种编程语言对它都有很好的支持。与它类似的是二进制文件,除了后者不可直接查看内容外,后者的操作速度也要好一些。当程序已经用到数据库时,此时只需多建一个表就能方便地用数据库来实现资源共享。INI型文件的本来用途是为程序初始化时提供参数,但我们仍可以用它作为共享文件。它操作界面最为友好,可以设定项目分组,可以指定各种数据类型,而不是局限于字符型,对空格、分行没有限制,文件可以在外部方便地查看与修改。其一般步骤是:控制模块把要传出的信息写到文件中,并同时写上一个读写标志;图形模块一直在监视读写标志,当得到可读标志后。才把信息文本读入。另一种办法是不设置可读标志,而让图形模块监视通信文件是否作了改动。如果是,则完整地把通信文件读入;如果否,则作忽略处理。相对来说,后一种办法更好一些。图形模块监视动作也可有两种选择:其一是在主线程中对文件作以监视,其特点是简单;其二是另建一个辅助线程对文件作以监视,其特点是高效。2.2共享内存区的方法共享内存是另一种常用的进程通信方式。它的突出优点是非常高效,在数据交换或读写频繁的场合,用共享硬盘文件的方法在速度上就不合要求,而操作内存则不会有此限制。常用的方法是共享动态连接库的可共享内存和共享内存映射文件。(1)共享动态连接库多个进程都可以对该共享数据的动态连接库进行数据操作,达到共享数据的目的。共享内存的动态连接库的创建与一般的动态连接库的创建没有很大区别。其不同之处在于在头文件中声明一个有名字的数据段;建立一个DEF型文件,在文件中对需共享的数据部分作出显式声明。因为在默认情况下,动态连接库中的数据对各个使用它的进程来说是互相独立的。(2)共享内存映射文件利用内存映射文件实现WIN32进程间的通讯。允许我们在WIN32进程中保留一段内存区域,把目标文件映射到这段虚拟内存中。在程序实现中必须考虑各进程之间的同步。具体实现步骤如下:首先我们在发送数据的进程中需要通过调用内存映射API函数Cre-ateFileMapping()创建一个有名的共享内存,并返回一个HANDLE对象。在创建文件映射对象后可以调用MapViewOfFile()函数映射到本进程的地址空间内。此时,获得一个指针,用memset()向此指针分配一定大小的内存区。其他进程访问共享对象,需要获得共享内存的名字并调用OpenFileMapping()函数。之后,可以像创建进程那样调用MapViewOfFile函数来映射对象视图,用户可以使用该对象视图来进行数据读写操作,以达到数据通讯的目的。当双方用户进程结束使用共享内存后,都需要调用Un-mapViewOfFile()函数以取消其地址空间内的视图,调用CloseHan-dle()取消HANDLE对象。并对自己开辟的内存区用delete()函数作以销毁。若把内存映射文件的过程作成一个动态连接库,则以后就可以在非C++的语言中轻易应用。综上所述:处理好接口问题是炮兵作战模拟系统中应用图形显示模块的关键。进程间的通信是处理接口的基础。为了直观,可通过数据库等进行数据传递;为了高效,可通过内存区进行数据传递。