探讨一个新的两个进程间的通信和编程模型 (Windows)
本文探讨一个新的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)的更多相关文章
- Unix系统中,两个进程间的通信
进程之间通常需要进行数据的传输或者共享资源等,因此进程间需要通讯. 可以通过管道,信号,消息队列,共享内存,信号量和套接字等方式 FIFO表示命名管道,这种管道的操作是基于先进先出原理. PIPE 表 ...
- C# 调用Windows API实现两个进程间的通信
使用Windows API实现两个进程间(含窗体)的通信http://blog.csdn.net/huangxinfeng/article/details/5513608 从C#下使用WM_COPYD ...
- ython实现进程间的通信有Queue,Pipe,Value+Array等,其中Queue实现多个进程间的通信,而Pipe实现两个进程间通信,而Value+Array使用得是共享内存映射文件的方式,所以速度比较快
1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #添加数据函数 def proc_write(qu ...
- Python 进程间的通信
#-*-coding:utf-8-*- '''python提供了多种进程间的通信方式,如:Queue,Pipe,Valie+Array等. Queue与Pipe的区别在于Pipe常用来在两个进程间通信 ...
- 【Scala】利用Akka的actor编程模型,实现2个进程间的通信
文章目录 步骤 一.创建maven工程,导入jar包 二.master进程代码开发 三.worker进程代码开发 四.控制台结果 步骤 一.创建maven工程,导入jar包 <propertie ...
- c 进程间的通信
在上篇讲解了如何创建和调用进程 c 进程和系统调用 这篇文章就专门讲讲进程通信的问题 先来看一段下边的代码,这段代码的作用是根据关键字调用一个Python程序来检索RSS源,然后打开那个URL #in ...
- python全栈开发day32-进程创建,进程同步,进程间的通信,进程池
一.内容总结 1.进程创建 1) Process:两种创建一个新进程的方法: 1.实例化Process,通过args=(,)元组形式传参,2创建类继承Process,类初始化的时候传参数 2) p.j ...
- [Socket]Socket进程间的通信
转自:http://blog.csdn.net/giantpoplar/article/details/47657303 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket ...
- Python网络编程(进程池、进程间的通信)
线程池的原理: 线程池是预先创建线程的一种技术.线程池在还没有任务到来之前, 创建一定数量的线程,放入空闲队列中.这些线程都是处于睡眠状态, 即均为启动,不消 ...
随机推荐
- CMake实践(2)
一,本期目标: [~@localhost t2]$ cat README this is README├── CMakeLists.txt├── COPYRIGHT├── doc│ └── hel ...
- 解决32位plsql客户端连接不64位Oracle11g上数据库
一.解决方案 因为本人安装的是64位的Oracle,plsql 是32位的故连接不上.网上有方法能连接. 1. 文件下载 下载PLSQL_Developer地址 http://pan.baidu.co ...
- acdream 1056 (黑白染色)
题意:给你一些关系,每个关系是两只马的名字,表示这两个马不能在一个分组里,问你能否将这些马分成两组. 黑白染色,相邻的点染不同颜色.bfs搞即可,水题. /* * this code is made ...
- bjfu1208 中位数
题目是给你一个数x以及一个长度为n的数列,让你往数列里插入y个数,使数列的中位数正好是x,求y的最小值.(其实这题的中位数跟数学里的中位数有一点区别,略去不提) 那么就排完序以后分情况讨论一下就好了. ...
- DzzOffice管理员登陆方法和管理员应用介绍
DzzOffice的管理方式类似于windows的管理方式,是直接在桌面中,通过管理员应用进行系统中的所有管理里工作. 1.访问http://www.domain.com (你站点的访问地址) 2.点 ...
- android测试本地服务调试流程
我今天调试的整个过程 1,安卓发现连不上本地的tomcat 2,使用浏览器直接尝试,发现可以连上 3,怀疑是安卓APP和浏览器访问有差异,后上网搜索不到APP,只有浏览器尝试 再不就是改I ...
- 3669 [Noi2014]魔法森林(LCT,最小生成树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题意] 给定一个无向图,求1-n的路径中最小的max{ai}+max{bi} ...
- Codeforces Round #364
http://codeforces.com/contest/701 A - Cards 水 // #pragma comment(linker, "/STACK:102c000000,102 ...
- CORBA
公共对象请求代理体系结构(Common Object Request Broker Architecture)
- codeforces 625C K-special Tables
C. K-special Tables time limit per test 2 seconds memory limit per test 256 megabytes input standard ...