基于多进程的铁路列车运行图编制系统及方法_3

文档序号:9417243阅读:来源:国知局
句柄,保存到本进程通信模块参数中,从而建立进程间通信数据通道和消息体系。
[0083] (4)子进程数据初始化:根据传入参数,导入主进程生成的数据文件,或加载主进 程指定的列车运行图数据库。
[0084] 3.主副进程数据同步协调
[0085] 主副进程间数据通信过程中要严格保证数据的一致性,要对数据进行同步协调管 理,主要包括主副进程自检、子进程启动与退出同步机制、子进程信息查询等关键功能,通 过这些功能来保证主副进程间的数据同步。
[0086] (1)进程信息管理数据结构
[0087] class CYxtProcessInfο // 运行图进程信息 {: public; HANDLE m hProccss ; // 进程句柄 DWORD m_nProcessId; // 进程ID CString m__sDbName; /7 数据库名称 }:; typedef CArray<CYxtProcessTafo, CYxtProcessInf〇&> CYxtProees slnif oArray; class CYxtProcessManage // 运行图进程管理 {
[0088] DWORD ni_riFathProcessId.; // 父进程ID (0为主进程) DWORD m nCurrentProcessId; // 当前进程ID HANDLE rn_hShareMemory; // 共享内存句柄 LPfOID m_pShareiemory; // 共享内存指针 GMutex ^pShareMtitex; // 共享Mutex指针 CBvent *m-pShareEvent; // CEvent *ra_pDealMarkEvent; // 处理标志Event指针 int mi Type; // (进程传递)类型 CString m-sParam; "(进程传递)参数 CYxtProcessInfoArray m_ChildrenProcess; // 子进程信息列表 };
[0089] (2)进程自检
[0090] 进程创建之初,根据传入的参数信息,确定进程身份信息,并记录于上述结构中。 主进程的父进程ID号为0,子进程则根据参数信息记录父进程的ID号。
[0091] (3)子进程启动与退出同步机制
[0092] 主进程创建子进程之前,首先建好共享内存、Mutex互斥量和通知事件,然后根 据副进程类型设置子进程启动参数,调用系统函数启动子进程,同时把各类参数传递到子 进程,并记录函数返回信息,生成子进程CYxtProcessInfo (进程信息)节点,记录到m_ ChildrenProcess (子进程信息列表)中。
[0093] 子进程早于主进程退出时,向共享内存写入退出信息,通知主进程,然后立即退 出。主进程收到通知后,获取共享内享信息,从子进程列表中删除已相关记录。
[0094] 主进程早于子进程退出时,同样在共享内存中发出退出命令,然后通过对进程句 柄事件的检测,等待子进程退出。如果子进程退出超时,则强制结束子进程。在所有子进程 退出后,撤销共享内存、互斥量和通知事件,结束本进程。
[0095] (4)子进程查询:根据m_ChildrenProcess (子进程信息列表)记录内容,获取所 有子进程信息。可指定子进程ID或句柄进行查询。
[0096] 4.主进程与副进程通信
[0097] (1)通信方式的选择
[0098] 计算机进程间通信通常有三种方式:共享内存、管道和文件。
[0099] 共享内存实现相对较容易,传输速度快,但缺点是存储量不能大;
[0100] 管道能实现数据流化传输,易于存取,但数据界线不明确,需加工处理;
[0101] 文件既能格式化读写,也可以流化处理,并且存储量大,但缺点是速度慢、效率相 对较低。
[0102] 运行图系统在实现副系统与主系统同步工作时,除批量传输列车数据外,其它交 互数据的特点是:量小、规格化、高效率,故而采用共享内存最为合适。对批量列车数据传递 采用了特殊的处理办法。
[0103] (2)通信实现技术
[0104] 进程启动后,通过创建或参数传递方式获取了共享内存句柄、进程通信Mutex互 斥量句柄、进程通知事件句柄,以此建立了进程间通信的基本通道。
[0105] 为了不影响进程正常事务处理,进程间通信采用异步消息通知方式。在建立了通 信通道后,进程中启用专用线程,用以监测通知事件消息。调用WaitForSingleObjectO基 础API函数,通过睡眠方式,等待全局通知事件消息的触发。当线程被唤醒后,检测系统环 境,确保正常时,立即对Mutex互斥量加锁,从共享内存中取数据并复制到私有内存中,然 后触锁,将数据交由主线程分析处理。
[0106] (3)数据同步与互斥
[0107] 根据运行图系统多进程数据交换的需求,结合进程通信各种方式的优缺点,运行 图系统采用共享内存方式实现主副进程间的通信机制。实际就是将命令或数据写入共享内 存,通知其它进程收取数据的过程。
[0108] 在实现通信过程中,为保证数据完整性,需要各进程对共享内存进行独占式访问, 因而引入进程间的通信旗语,具体采用了 Mutext信号量,做为共享内存独占访问的互斥锁 变量。任何进程在发送或接收进程消息时,必须检测互斥信号量的加锁状态,发现被锁即睡 眠等待,直到解锁。这一机制是由操作系统实现的调度控制,可有效保证共享内存的数据安 全。
[0109] 数据写入共享内存后,需要通知接收进程取数据,因此引入可在进程间产生消息 的"事件"信号量,实现进程取数据的同步机制。
[0110] 进程间的通信过程,可简单概括为"加锁一一写数据一一解锁一一通知"和"加 锁一一读数据一一解锁"两过程,是对共享内存、Mut ex信号量、事件信号量的综合应用。
[0111] (4)主副进程通信协调方法
[0112] 为保证进程通信正常畅通,防止因进程死锁或异常中止造成进程间通信异常,以 及防止数据重复接收,采用了以下几种方法保障通信:
[0113] ?清空旧数据。接收进程收到数据后,自动清除共享缓冲区里的旧数据。除非该数 据不只是发给本进程的,则不清空。
[0114] ?强制睡眠。接收进程如果没接收到任何数据,则强制接收数据的线程进行睡眠, 为发送进程占用共享内存让出时间片。
[0115] ?建立接收数据缓冲区。新收到的数据与缓存数据进行二进制匹配,发现是相同数 据,则丢弃,不重复处理。
[0116] ?针对大数据交换,建立"处理一一应答"机制,即数据发送方在发送完数据后,等 待接收方回复应答消息。通过专用的"事件"信号量,由进程双方来改变"事件"的状态,从 而传递状态信息,实现应答机制。发送进程必须等待接收方回复以后,才能继续下一次发 送。如果接收方长时间未回复,则进入相应的应急处理流程。
[0117] (5)监听线程
[0118] 监听线程专用于接收"数据到达"的通知事件的线程。该线程负责从共享内存中 取出数据,根据数据内容,执行相应命令,或是把数据转交给主线程分析处理。其具体流程 是:
[0119] 步骤1 :进入循环,等待"事件"信号触发。
[0120] 步骤2 :收到事件,或是在较长时间的等待后自动唤醒,即时检查系统环境。如果 检测到了系统退出标志,则不再继续执行,退出线程;如果是系统环境正常,则进行下一步 处理。
[0121] 步骤3 :调用相关处理,读取共享内存中接收到的数据。
[0122] 步骤4 :如果未收取到任何数据,系统睡眠一定时间,然后重新返回到第1步;如果 收到数据,则进行下一步处理。
[0123] 步骤5 :简单分析数据头,判断数据类型。如果是控制命令,在本线程中立即分析 处理;如果是运行图系统数据,进行下一步处理。
[0124] 步骤6 :开辟缓存,复制数据,将缓存数据发送到主线程,交由相关控制程序自动 分析处理。
[0125] 步骤7 :清除共享内存中的过期数据。
[0126] 步骤8 :如果是大数据交换过程,设置应答处理标志。
[0127] 步骤9 :整个处理过程发现异常,则报告或记录异常,否则返回到第1步,进行下一 轮等待。
[0128] 5.主副进程数据交换方法
[0129] (1)数据交换方式的选择
[0130] 数据交换方式一般采用数据报和数据流两种方式。
[0131] 数据报文方式具有固定的格式、特定的长度,以事件完整的描述为一个信息单元, 整体打包发送和接收;数据流方式则较为灵活,无固定格式,没有发送次数和字节数的限 制,只管将发送方的信息全部递交到接收方,由接收方组合、提取、解析和处理。
[0132] 数据报文方式实现
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1