Delphi如何实现内存共享

原文来自: http://my.oschina.net/pc100/blog/380956

一.原理

    通过使用“内存映射文件”,实现内存共享

二.主要操作

    共享内存结构:

  PShareMem = ^TShareMem;
  TShareMem = Record
    id:string[10];
    name:string[20];
    age:Integer;  end;

    基本变量:

    shareMemName:string; //共享内存名
    fileHandle : THandle;//内存映射文件句柄
    pUserInfoShareMem : PShareMem;//指向共享内存的指针

    a)写入程序

1)创建“内存映射文件”

   //=CreateFileMapping($FFFFFFFF, , PAGE_READWRITE, , SizeOf(TShareMem), PChar(shareMemName));
 fileHandle <>  
   ;

2)建立映射关系

  //将“内存映射文件”与“应用程序地址空间”建立映射关系
  pUserInfoShareMem:=MapViewOfFile(fileHandle,FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem));  if pUserInfoShareMem <> nil then
  begin
     Self.Memo1.Lines.Add(‘已成功建立映射关系!‘);  end;

3)写入信息

   pUserInfoShareMem.id:=‘8888‘;
   pUserInfoShareMem.name:=‘Terry‘;
   pUserInfoShareMem.age:=25;
   Self.Memo1.Lines.Add(‘已向共享内存中写入用户信息!‘);

4)解除映射关系

  //解除“内存映射文件”与“应用程序地址空间”的映射关系  if pUserInfoShareMem<> nil then
     UnmapViewOfFile(pUserInfoShareMem);
  Self.Memo1.Lines.Add(‘已成功解除映射关系!‘);

5)关闭“内存映射文件”

  //关闭内存映射文件  if fileHandle<> 0 then
     CloseHandle(fileHandle);
  Self.Memo1.Lines.Add(‘已成功关闭内存映射文件!‘);

 

    b)读取程序

1)打开“内存映射文件”

 fileHandle:=OpenFileMapping(FILE_MAP_ALL_ACCESS,false,pchar(shareMemName));  if self.FileHandle <> 0 then
  begin
    Self.Memo1.Lines.Add(‘已成功打开内存映射文件!‘)  end;

2)建立映射关系

   pUserInfoShareMem:= MapViewOfFile(self.FileHandle,windows.FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem));   if pUserInfoShareMem <> nil then
   begin
     Self.Memo1.Lines.Add(‘已成功建立映射关系!‘);   end;

3)读取信息

   if pUserInfoShareMem <> nil then
   begin
      userInfoStr:=‘共享内存中获取的用户信息如下:‘+#13#10;
      userInfoStr:=userInfoStr+‘用户Id号:‘+pUserInfoShareMem.id+#13#10;
      userInfoStr:=userInfoStr+‘用户姓名:‘+pUserInfoShareMem.name+#13#10;
      userInfoStr:=userInfoStr+‘用户年龄:‘+IntToStr(pUserInfoShareMem.age);
      Self.Memo1.Lines.Add(userInfoStr);   end;

4)解除映射关系

  if pUserInfoShareMem<> nil then
     UnmapViewOfFile(pUserInfoShareMem);
  Self.Memo1.Lines.Add(‘已成功解除映射关系!‘);

5)关闭“内存映射文件”

  if fileHandle<> 0 then
     CloseHandle(fileHandle);
  Self.Memo1.Lines.Add(‘已成功关闭内存映射文件!‘);

    c)交互顺序

1)“写入程序”创建共享内存,并写入信息

2)“读取程序”从共享内存读取信息,并解除映射,关闭文件

3) “写入程序”解除映射,关闭文件

PS:“写入程序”解除映射关系,关闭内存映射文件对“读取程序”的影响。
          1) 写入程序解除映射关系,不影响读取程序的读取操作关闭内存映射文件,会

影响读取程序的读取操作
          2) 解除映射关系与关闭内存映射文件无顺序要求,及时不解除映射关系也可直

接关闭内存映射文件
          3) 两个程序通讯时,要使用sendmessage,同步操作,而不是postmessage,

防止前者已关闭内存映射文件,而后者还没读取。

时间: 2024-10-30 12:58:48

Delphi如何实现内存共享的相关文章

PHP共享内存段实现,使用shmop函数实现内存共享

所谓内存共享:就是多个应用程序公用一个内存段,在A程序中可以获取B程序存储在这个内存段的数据,也就是数据共享. shmop是PHP提供的函数集,在配置PHP的时候使用 -enable-shmop后,就可以使用这个函数集提供的函数, shmop对LINUX更加友好,而对于WINDOWS来说就不怎样了,不支持CGI和CLI模式~有点尴尬. 来说说他提供的一些函数: ftok函数:生成一个数字或叫做键或key.$key = ftok(fileName, mode); 一般情况下,这个fileName可

进程通信之内存共享篇

进程通信之_ 内存共享 概念:共享内存是被多个进程共享的一部分物理内存.共享内存是进程间的共享数最快的方法,一个进程向共享内存区域写入数据,共享这个内存区域的所有进程就可以写入数据,所有进程就可以立刻看到其中的内容. 实现步骤;1.创建共享内存,使用shmget函数2.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数 创建:int shmget (key_t key,int size,int shmflg)key 标识内存功效的键值0/ipc_private.成功返回

进程通信(二)&mdash;&mdash; 信号量&amp;内存共享

内存共享是进程间常用的通信方式,可以实现两个完全独立的进程通信. 在访问共享内存时,同时需要信号量进行访问控制. 使用ipcs -m命令可以查看系统共享内存,ipce -m + key 可以删除指定的共享内存. 对共享内存操作时,使用信号量对共享内存进行保护,类似与线程中的互斥锁.都可以看做是通过PV操作实现临界资源保护. P:对信号量标记位-1,获取信号量,如果标记位为0,表示有其他进程占用资源,无法获取. V:对信号量标记位+1,释放信号量,将资源释放,给其他进程使用. 信号量和内存共享需要

内存共享

共享内存共享内存是进程间通信中最简单的方式之一. 共享内存允许两个或更多进程访问同 一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一 个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改. 因为所有进程共享同一块内存, 共享内存在各种进程间通信方式中具有最高的效率. 访 问共享内存区域和访问进程独有的内存区域一样快, 并不需要通过系统调用或者其它需要切 入内核的过程来完成.同时它也避免了对数据的各种不必要的复制

SAP开发经验之内存共享

内存传值 1用户内存共享 1.1   Sap内存: 1.1.1 共享范围:被所有的主session访问,内存数据可以在同一个session中不同程序之间,或者不同session之间共享. 1.1.2 作用范围:整个中端session时间内有效. 1.1.3 用法: SET PARAMETER ID ‘MAT’ FIELD P_MATNR. GET PARAMETER ID ‘MAT’ FIELD P_MATNR. 1.2   ABAP内存: 1.2.1  共享范围:在一个session不同程序之

内存共享和过量使用区别在哪里

[TechTarget中国原创] 共享(sharing)和过量使用(overcommitment)这两种内存管理技术都能够帮助提升系统整合性,但是在使用它们之前,管理员应该首先了 解二者之间的细微差别. 一台服务器能够支持的虚拟机数量通常取决于物理硬件所能够提供的可用计算资源.大多数资源,比如处理器周期.存储I/O和网络带宽等,都能够相对简单地进 行共享.这种做法的原理在于负载并不总是处于忙碌状态,因此共享——或者过度使用——资源能够实现更高等级的负载整合,因此为虚拟机分配的资源总量和可以 超过

C/C++ 进程间通信 内存共享

介绍内存共享前,说下之前的误区,觉得,可以用指针来在父子进程中传递数据,其实,在fork()后,父子进程的地址空间是相互独立的!所以在父子进程间传递指针是没有意义的. 这里就涉及到物理地址和逻辑地址(或称虚拟地址)的概念. 从逻辑地址到物理地址的映射称为地址重定向.分为: 静态重定向--在程序装入主存时已经完成了逻辑地址到物理地址和变换,在程序执行期间不会再发生改变. 动态重定向--程序执行期间完成,其实现依赖于硬件地址变换机构,如基址寄存器. 逻辑地址:CPU所生成的地址.CPU产生的逻辑地址

进程间通信(4)---最高效的进程间通信方式--内存共享

内存共享   内存共享,它也是一种进程间通信的方式,它是在虚拟地址空间中堆和栈地址空间的中间的共享映射区中开辟一块地址,然后由页表和mmu在物理内存中开辟一段空间,其他进程如果获取到了这个内存的ID便可以和另外的进程共享这段内存. 内存共享的特点:高效,它比其他的进程间通信的方式都要高效因为它直接看到的就是相当于他自己的一块内存.  要用到的函数: int shmget(key_t key, size_t size, int shmflg);//创建共享内存 void *shmat(int sh

python 中的Array,Value及内存共享

官网文档的例子 1 from multiprocessing import Process, Value, Array 2 3 def f(n, a): 4 n.value = 3.1415927 5 for i in range(len(a)): 6 a[i] = -a[i] 7 8 if __name__ == '__main__': 9 num = Value('d', 0.0) 10 arr = Array('i', range(10)) 11 12 p = Process(target