进程间内存共享问题[转]
.net中可以通过InteropServices调用unmanaged库的方法CreateFileMapping等来创建和使用共享内存。但是如何将一个对象数组对应到创建的内存块呢?这样一来,内存创建后就不用管了,只要对对象数组进行操作就可以了,请高手指点。
------------------------------------------------------------------------------------------------------------------------------------
#region 非托管函数声明
[DllImport("kernel32.dll",EntryPoint="OpenFileMapping",SetLastError=true, CharSet=CharSet.Auto) ]
private static extern IntPtr OpenFileMapping (int dwDesiredAccess, bool bInheritHandle,String lpName );
[DllImport("Kernel32.dll",EntryPoint="CreateFileMapping",SetLastError=true,CharSet=CharSet.Auto)]
private static extern IntPtr CreateFileMapping(uint hFile, IntPtr lpAttributes, uint flProtect,uint dwMaximumSizeHigh, uint dwMaximumSizeLow, string lpName);
[DllImport("Kernel32.dll")]
private static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject,uint dwDesiredAccess, uint dwFileOffsetHigh,uint dwFileOffsetLow, uint dwNumberOfBytesToMap);
[DllImport("Kernel32.dll",EntryPoint="UnmapViewOfFile",SetLastError=true,CharSet=CharSet.Auto)]
private static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
[DllImport("kernel32.dll",EntryPoint="CloseHandle",SetLastError=true,CharSet=CharSet.Auto)]
private static extern bool CloseHandle(uint hHandle);
[DllImport("kernel32.dll",EntryPoint="GetLastError",SetLastError=true,CharSet=CharSet.Auto)]
private static extern uint GetLastError();
#endregion
struct Money
{
public int EmployeeNo;
public float Salary;
};
Money[] g_Money = new Money[100];
for(int i = 0; i < 100; i++)
{
g_Money[i] = new Money();
g_Money[i].EmployeeNo = i;
g_Money[i].Salary = i*i;
}
try
{
IntPtr memoryFileHandle = CreateFileMapping(0xFFFFFFFF,IntPtr.Zero,(uint)4,0,(uint)(100*8),"SHARE_MEMORY");
if(memoryFileHandle == IntPtr.Zero)
{
MessageBox.Show("Create Share Memory Failed!");
return;
}
g_hMoney = MapViewOfFile(memoryFileHandle,(uint)983071,0,0,(uint)(100*8));
if(g_hMoney == IntPtr.Zero)
{
MessageBox.Show("Create Share Memory Failed!");
return;
}
int basePos = g_hMoney.ToInt32();
for(int j = 0; j < 100; j++)
{
//我现在的做法,每次将数组对象g_Money一个一个的复制到内存中去
Marshal.StructureToPtr(g_Money[j], (IntPtr)(basePos + j * 8), true);
//我现在的做法,每次将内存中的数据复制到数组对象g_Money中
// g_Money[j] = (Money)Marshal.PtrToStructure((IntPtr)(basePos + j * 8), typeof(Money));
}
}
catch(System.Exception exception)
{
MessageBox.Show(exception.Message);
}
我想要得到的效果就是:只要访问g_Money数组就可以直接访问内存,象VC中一样,不要每次对g_Money赋值后再调用Marshal.StructureToPtr修改内存,而每次内存修改后又用Marshal.StructureToPtr读取内存到g_Money来
============================
看了一些API,找了一些资料,对这个内存共享还不是很了解。但听同事说在日志管理上还是可以用得上的,特别是多进程间日志管理,这个问题我遇到好久了,就先收集一些文章,到后面再慢慢的学习使用吧。
上面的代码我还没有测试过,看了一下,觉得有些错误,一会我自己试试,同时对这个内存共享问题也多了解一些。
转载于:https://www.cnblogs.com/WuCountry/archive/2006/08/14/476220.html
进程间内存共享问题[转]相关推荐
- symbian进程间内存共享
最近看了一些进程间通讯的资料,基本上原理是一样的,在一个线程开一个全局的服务,另外一个可以通过全名字,或者部分名字查找这个服务,然后取得这个全局服务的内存地址,得到内存中的数据. 在symbian上有 ...
- linux进程间通讯-共享内存
文章目录 共享内存概述 共享内存的特点 共享内存操作 在ubuntu 12.04中共享内存限制值如下 获得一个共享存储标识符 创建共享内存 共享内存映射(attach) 解除共享内存映射(detach ...
- WIN32 进程间通讯-共享内存
一.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...
- 进程间基于共享存储区的通信_IPC(进程间通讯):inter process communication
管道 (1)管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: (2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): (3)**单独构成一种独立的文件系统:**管道 ...
- python multiprocessing 进程间如何共享数据、对象
参考文章1:Python 进程间的数据共享 参考文章2:Python多进程编程-进程间共享 对象
- linux进程实现进程通信内存共享,Linux进程间通信 -3内存共享
内存共享允许两个或多个不相关的进程,访问同一个逻辑内存,共享内存的具体实现,由不同进程之间共享的内存安排为同一物理内存. 过个进程就像通过malloc获取的内存一样去使用,但是需要额外的小消息来同队内 ...
- 开启子进程的两种方式、进程间内存空间隔离、进程对象的方法或属性详解
1.操作系统(推荐查看书籍:现代操作系统) 操作系统是位于计算机硬件与软件之间的控制程序 作用: 1.将硬件的复杂操作封装成简单的接口,给用户或者应用程序使用 ...
- 进程间通信(1) dll 实现进程的内存共享
1. 两个进程访问同一个dll 2.写入时复制(CopyOnWrite,简称COW)思想 如果有多个调用者(Callers)同时访问相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同的指针 ...
- c++ 内存映射文件进程间共享数据
int main(int argc, char *argv[]) { //RecursiveDelete("C:\\20_128\\"); //Self ...
最新文章
- 每日英语:China's Youth to Employers: I Quit
- Python中time模块详解
- /lib64/libc.so.6 is not a symbolic link 解决方法
- rails3使用ActionMail发送邮件
- python class函数报错_Python 的函数是第一类 First-Class 对象
- 图像处理傅里叶变换的理解及其matlab实现
- 单体 soa 微服务 区别_漫谈何时从单体架构迁移到微服务?
- Could not find support-media-compat.aar
- python填空题_Python题库-填空题
- 满二叉树及完全二叉树的相关性质证明
- 视觉SLAM笔记(60) 建图
- [APIO2011] 方格染色
- LeetCode(461)——汉明距离(JavaScript)
- 中国开源激荡 20 年:IT 江湖,谁主沉浮?
- win10 使用量产工具后usb无法 识别硬件修复 Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Contro
- 致远互联开始向云端生态发力奔跑
- 集成软件开发环境WipeOut
- 必做作业三_ShareX结构化原型设计
- usb一致性测试软件,USB 3.0一致性测试方法
- 告别传统IT 信天通信助推教育行业云化变革
热门文章
- 清华大学计算机系高考生源,清华大学在这个高考大省录取人数创新高,网友:仍然是同分不同命...
- 计算机控制系统EHA,优·计算机控制技术第四章.doc
- windows和linux存储float,C语言float型数据在内存中的储存方式
- android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码
- 【JAVA基础篇】反射
- 如何在博客中插入背景音乐
- css不继承父类样式_提升你的Python编程能力,细说类的继承,拿走不谢
- opencv为matlab,OpenCV与matlab部分函数的对应关系(转)
- Linux下C/C++程序编译链接加载过程中的常见问题及解决方法
- mysql 嵌入式 性能_database – 在mySQL中优化嵌入式SELECT查询