• 内存共享【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('已成功关闭内存映射文件!');

         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

      3) 分享自http://www.cnblogs.com/edisonfeng/archive/2012/05/21/2511975.html

  • 相关阅读:
    Java中Filter、Servlet、Listener的学习 (转)
    Servlet 获取商品信息作业
    Servlet 注册与提交作业
    jsp servlet的区别和联系(转)
    用户注册验证留言程序
    作业1
    简单新闻发布系统
    webform 增速删改查 方法
    存取数据库图片
    打印 保存
  • 原文地址:https://www.cnblogs.com/zhunian/p/4998693.html
Copyright © 2020-2023  润新知