本文探讨一个新的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. CMake实践(2)

    一,本期目标: [~@localhost t2]$ cat README this is README├── CMakeLists.txt├── COPYRIGHT├── doc│   └── hel ...

  2. 解决32位plsql客户端连接不64位Oracle11g上数据库

    一.解决方案 因为本人安装的是64位的Oracle,plsql 是32位的故连接不上.网上有方法能连接. 1. 文件下载 下载PLSQL_Developer地址 http://pan.baidu.co ...

  3. acdream 1056 (黑白染色)

    题意:给你一些关系,每个关系是两只马的名字,表示这两个马不能在一个分组里,问你能否将这些马分成两组. 黑白染色,相邻的点染不同颜色.bfs搞即可,水题. /* * this code is made ...

  4. bjfu1208 中位数

    题目是给你一个数x以及一个长度为n的数列,让你往数列里插入y个数,使数列的中位数正好是x,求y的最小值.(其实这题的中位数跟数学里的中位数有一点区别,略去不提) 那么就排完序以后分情况讨论一下就好了. ...

  5. DzzOffice管理员登陆方法和管理员应用介绍

    DzzOffice的管理方式类似于windows的管理方式,是直接在桌面中,通过管理员应用进行系统中的所有管理里工作. 1.访问http://www.domain.com (你站点的访问地址) 2.点 ...

  6. android测试本地服务调试流程

    我今天调试的整个过程 1,安卓发现连不上本地的tomcat 2,使用浏览器直接尝试,发现可以连上 3,怀疑是安卓APP和浏览器访问有差异,后上网搜索不到APP,只有浏览器尝试       再不就是改I ...

  7. 3669 [Noi2014]魔法森林(LCT,最小生成树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题意] 给定一个无向图,求1-n的路径中最小的max{ai}+max{bi} ...

  8. Codeforces Round #364

    http://codeforces.com/contest/701 A - Cards 水 // #pragma comment(linker, "/STACK:102c000000,102 ...

  9. CORBA

    公共对象请求代理体系结构(Common Object Request Broker Architecture)

  10. codeforces 625C K-special Tables

    C. K-special Tables time limit per test 2 seconds memory limit per test 256 megabytes input standard ...