消息通讯和内存共享的问题
来源:互联网 发布:阿里云 25端口解封 编辑:程序博客网 时间:2024/05/16 12:57
前段时间LED项目需要我和同事的两部分合并起来,他的程序是用VC写的,而我的程序是c#写的,由于我们数据需要通讯,苦思冥想终于想出的一个办法:内存共享及消息通讯。
首先我们之间制定了一些协议,规定了我们直接的通讯方式是通过发送不同的消息来执行对应的命令。比如说,我这边发送WM_CHIP的消息过去,然后他接收到这消息之后就执行相关操作,然后再给我反馈一个WM_NEXT的消息。
具体步骤如下:(C#代码)
public const int WM_USER = 0x400;
public const int WM_CHIPS = WM_USER + 101;
public const int WM_NO_CHIPS = WM_USER + 102;
.......
private IntPtr hFileMap;//共享内存句柄
private IntPtr address; //传输数据地址句柄
private IntPtr mesgptr; //对方应用程序的句柄
mesgptr = Win32.FindWindow(null, "程序名");//FindWindow和SendMessage为系统API函数,要DllImport声明
SendMessage(mesgptr, WM_XX, 0, 0);
接收的情况,需要重载DefWndProc函数:
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_XX://处理消息
break;
case WM_XX2:
break;
.......
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
内存共享即开辟一个共享的内存空间,让两个不同的程序可以在里面读写数据,共享的内存空间开辟一次即可,程序关闭时释放其内存。
//CreateFileMapping和MapViewOfFile为系统API函数,要DllImport声明
hFileMap= CreateFileMapping(Win32.InvalidHandleValue,
IntPtr.Zero, Win32.PAGE_READWRITE, 0, 0x100, "MYLEDSHARE");
if(hFileMap!=null)
{
address = WinMapViewOfFile(hFileMap, Win32.FILE_MAP_WRITE, 0, 0, IntPtr.Zero);
if(address==IntPtr.Zero)
{
MessageBox.Show("创建mapviewoffile出错");
return;
}
}
创建成功,address即为共享内存的地址(不知道该称为句柄还是指针,用法和指针差不多),然后调用Marshel的相关函数读写内存地址即可,如:
Marshal.WriteByte(address, i, (byte)(arr[i]));//写第i个字节数据进去共享内存,arr为数据内容,arr为char[]数组。
arr[i]=Marshal.ReadByte(address, i);//从内存里读第i个字节的数据并存到arr里。
测试过两个不同的程序实现消息和内存通讯所耗的时间少于1毫秒。
后记:这个技术已经成为历史,因为为了通讯的实时性,我的同事已经把他的程序改成用c#写了。写这篇东西是为了纪念一下当时学了这个看起来很高级的技术,呵呵。
- 消息通讯和内存共享的问题
- 进程间通讯的消息队列和共享内存方式的实现
- 共享内存和消息传递
- Linux 下监控程序 -- 共享内存通讯,消息订阅发布
- 进程间通讯共享内存的具体步骤
- 进程之间的通讯之共享内存
- linux 消息队列 和 内存共享的简短说明
- linux后台查看共享内存和消息队列的命令
- 共享内存通讯
- 共享内存通讯编程
- VMware 网络共享和通讯问题
- 第四课 共享内存和消息队列
- 信号机制、共享内存和消息队列
- 信号机制、共享内存和消息队列
- Linux信号量 共享内存和消息队列
- Linux C 消息队列和共享内存
- linux 信号量、共享内存、和消息队列
- 信号量、消息队列和共享内存
- cramfs文件系统-嵌入式下的特种部队
- OOP面向对象:Liskov替换原则--LSP
- JAVA 抓取网页内容
- 依赖倒置原则(DIP) OOP面向对象...
- AS400 RPG使用条码打印机(Zebra888-TT)打印中文标签-1
- 消息通讯和内存共享的问题
- 完美理解ruby中的yield的概念
- 牛人牛博
- 导入Excel汇总文章
- Lightbox类
- 个人外包项目全记 - Best Partner (二十)最后一次大考1
- 第二个项目在呼和浩特
- [MSSQL]自定义分割函数
- 梦想不熄