本文探讨一个新的Windows上的两个UI进程间的通信和编程模型。

开门见山,下面是这个通信模型的梗概图:

这个模型的设计目标描述如下:

(1)发送数据接口:RpcSend, RpcPost

  • RpcSend是同步接口,发送数据到目标fsm, 同时接收返回数据,其原型为

int RpcSend(const char* strFsmName, unsigned int uEvent, PBYTE pMsgData, int nMsgDataLen, PBYTE& pResultData, int& nResultDataLen);

参数说明:

strFsmName: 目标状态机名称

uEvent: 事件id

pMsgData: 待发送数据

nMsgDataLen: 数据长度

pResultData:应答数据

nResultDataLen: 应带数据长度

返回值是发送的数据长度。

  • RpcPost 定义为发送数据到目标fsm,与RpcSend相比,它不能接收到对方的返回数据。

int RpcPost(const char* strFsmName, unsigned int uEvent, PBYTE pMsgData, int nMsgDataLen);

参数说明:

strFsmName: 目标状态机名称

uEvent: 事件id

pMsgData: 待发送数据

nMsgDataLen: 数据长度

返回值是发送的数据长度。

(2)接收数据在状态机的事件函数中处理,函数原型为:onEventProc。

(3)应用的逻辑在状态机模型FSM中完成实现。

(4)两端的Container的功能为通信适配和容器的工作。它可以独立运行在一个新线程中,也可附着在现有应用的UI线程中。hMainWnd是这个Container的主窗口,如果该Container附着在一个应用的窗口上,hMainWnd就是这个窗口句柄.

(5)Pipe完成IPC的进程间通信,监听接收到数据,并发送给窗口消息过程。

实际上,在应用结构中,需要多个状态机的组合才能实现一个完整的应用需求,这组状态机需要一个管理者(Fsm Manager)来作为他们的容器或通信的纽带。

Fsm Manager需要从Fsm继承而来,所以它实际上也是一个状态机,这样做的好处能够通过状态机的组合创造出极大的灵活性和方便,同时RpcPost和RpcSend同样适用于Fsm Manager,因为它就是状态机。

状态机是怎么启动的? 我们需要一个Manifest.xml,这是一个配置文件,我们在其中配置需要启动的状态的名字和参数。Container在初始化的过程中,会把状态机启动。一般我们只需要设置一个需要启动的Fsm Manager,而其它的状态机,通过这个Fsm Manager完成启动。

探讨一个新的两个进程间的通信和编程模型 (Windows)的更多相关文章

  1. Unix系统中,两个进程间的通信

    进程之间通常需要进行数据的传输或者共享资源等,因此进程间需要通讯. 可以通过管道,信号,消息队列,共享内存,信号量和套接字等方式 FIFO表示命名管道,这种管道的操作是基于先进先出原理. PIPE 表 ...

  2. C# 调用Windows API实现两个进程间的通信

    使用Windows API实现两个进程间(含窗体)的通信http://blog.csdn.net/huangxinfeng/article/details/5513608 从C#下使用WM_COPYD ...

  3. ython实现进程间的通信有Queue,Pipe,Value+Array等,其中Queue实现多个进程间的通信,而Pipe实现两个进程间通信,而Value+Array使用得是共享内存映射文件的方式,所以速度比较快

    1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #添加数据函数 def proc_write(qu ...

  4. Python 进程间的通信

    #-*-coding:utf-8-*- '''python提供了多种进程间的通信方式,如:Queue,Pipe,Valie+Array等. Queue与Pipe的区别在于Pipe常用来在两个进程间通信 ...

  5. 【Scala】利用Akka的actor编程模型,实现2个进程间的通信

    文章目录 步骤 一.创建maven工程,导入jar包 二.master进程代码开发 三.worker进程代码开发 四.控制台结果 步骤 一.创建maven工程,导入jar包 <propertie ...

  6. c 进程间的通信

    在上篇讲解了如何创建和调用进程 c 进程和系统调用 这篇文章就专门讲讲进程通信的问题 先来看一段下边的代码,这段代码的作用是根据关键字调用一个Python程序来检索RSS源,然后打开那个URL #in ...

  7. python全栈开发day32-进程创建,进程同步,进程间的通信,进程池

    一.内容总结 1.进程创建 1) Process:两种创建一个新进程的方法: 1.实例化Process,通过args=(,)元组形式传参,2创建类继承Process,类初始化的时候传参数 2) p.j ...

  8. [Socket]Socket进程间的通信

    转自:http://blog.csdn.net/giantpoplar/article/details/47657303 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket ...

  9. Python网络编程(进程池、进程间的通信)

    线程池的原理:        线程池是预先创建线程的一种技术.线程池在还没有任务到来之前,        创建一定数量的线程,放入空闲队列中.这些线程都是处于睡眠状态,        即均为启动,不消 ...

随机推荐

  1. [转] ArcGIS engine中气泡标注的添加、修改

    小生 原文 ArcGIS engine中气泡标注的添加.修改! 你微微地笑着,不同我说什么话.而我觉得,为了这个,我已等待得久了.                                   ...

  2. Android http协议实现文件下载

    用http协议下载文件,主要用到的是httpURLConnection对象,主要的步骤如下: 1. 创建HttpURLConnection对象 2.获得一个InputStream对象 3.修改权限:访 ...

  3. Easy Climb

    题意: 有n块石头,给定他们的高度,现保持第一和最后一块高度不变,其他可增加和减少高度,求通过变换使所有相邻石头的高度差的绝对值不大于d,所变化高度总和的最小值. 分析: 状态还可以想出来,dp[i] ...

  4. Richedit使用大全

    原文地址:http://blog.csdn.net/pcseye/article/details/3903333 一.常见问题 a.可以编译,不能执行的 AfxInitRichEdit(); b.升级 ...

  5. openfl关于windows平台编译报错解决办法

    报错信息:  无法打开程序数据库“e:\newproj\mainclient\bin\windows\cpp\obj\obj\msvc-debug-ncxp\vc.pdb”:如果要将多个 CL.EXE ...

  6. HDU 5311

    把anniversary分成三个区间,分别枚举每个区间在给定模板中的长度.每次枚举完一个区间,记录下区间长度和起始坐标,下次从剩下长度开始枚举,避免重复. #include<iostream&g ...

  7. mysql怎么让一个存储过程定时执行

    比如说每天的12:30执行 查看event是否开启: show variables like '%sche%'; 将事件计划开启: set global event_scheduler=1; 关闭事件 ...

  8. PHP:PHP5.4连接SQLSERVER

    在PHP5.4的环境下要连接SQLSERVER(2005/2008)数据库,需要以下步骤: 1.下载PHP5.4连接SQLSERVER的驱动(两个动态连接库)http://www.microsoft. ...

  9. C# 释放非托管资源

    C#中资源分为托管资源和非托管资源. 托管资源由垃圾回收器控制如何释放,不需要程序员过多的考虑(当然也程序员也可以自己释放). 非托管资源需要自己编写代码来释放.那么编写好的释放非托管资源的代码(释非 ...

  10. JSP学习初体验

    JSP简介: 1)JSP--Java Server Pages 2)拥有servlet的特性与优点(本身就是一个servlet) 3)直接在HEML中内嵌JSP代码 4)JSP程序由JSP Engin ...