內存共享【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM