• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

内存共享【Delphi版】 - mobile9944

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

内存共享【Delphi版】

一.原理

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

二.主要操作

    共享内存结构:

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

    基本变量:

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

    a)写入程序

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

begin
   //创建“内存映射文件”
   fileHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TShareMem), PChar(shareMemName));
if fileHandle <> 0 then begin Self.Memo1.Lines.Add(\'已成功创建内存映射文件!\'); end; end;

        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,

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

 

三.其他

    1)常驻内存参考:建立磁盘物理文件,而不是内存映射文件

       http://topic.csdn.net/u/20070616/08/ec12fda5-63c7-4c60-9c30-04795d70a922.html
                            

     2) 原理详细分析:http://blog.csdn.net/khuang2008/article/details/3949720


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap