内存映射 读和写

//读
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    btn5: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
  private
    { Private declarations }
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  PShareMem = ^TShareMem;

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

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

  // 1)创建“内存映射文件”
procedure TForm1.btn1Click(Sender: TObject);
begin
   fileHandle:=OpenFileMapping(FILE_MAP_ALL_ACCESS,false,pchar(shareMemName));
  if FileHandle <> 0 then
  begin
    Self.mmo1.Lines.Add(‘已成功打开内存映射文件!‘)
  end;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
 pUserInfoShareMem:= MapViewOfFile(FileHandle,FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem));
   if pUserInfoShareMem <> nil then
   begin
     Self.mmo1.Lines.Add(‘已成功建立映射关系!‘);
   end;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
  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.mmo1.Lines.Add(userInfoStr);
   end;
end;

procedure TForm1.btn4Click(Sender: TObject);
begin
if pUserInfoShareMem<> nil then
     UnmapViewOfFile(pUserInfoShareMem);
  Self.mmo1.Lines.Add(‘已成功解除映射关系!‘);
end;

procedure TForm1.btn5Click(Sender: TObject);
begin
 if fileHandle<> 0 then
     CloseHandle(fileHandle);
  Self.mmo1.Lines.Add(‘已成功关闭内存映射文件!‘);
end;

end.

//写
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    btn5: TButton;
    edtName: TEdit;
    lbl姓名: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
  private
    { Private declarations }
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  PShareMem = ^TShareMem;

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

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

  // 1)创建“内存映射文件”
procedure TForm1.btn1Click(Sender: TObject);
begin
   //创建“内存映射文件”
   fileHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TShareMem), PChar(shareMemName));
   if fileHandle <> 0 then
   begin
     Self.mmo1.Lines.Add(‘已成功创建内存映射文件!‘);
   end;
end;

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

procedure TForm1.btn3Click(Sender: TObject);
begin
   pUserInfoShareMem.id:=‘8888‘;
   //pUserInfoShareMem.name:=‘Terry‘;
   pUserInfoShareMem.name:=edtName.Text;
   pUserInfoShareMem.age:=25;
   Self.mmo1.Lines.Add(‘已向共享内存中写入用户信息!‘);
end;

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

procedure TForm1.btn5Click(Sender: TObject);
begin
  //关闭内存映射文件
  if fileHandle<> 0 then
     CloseHandle(fileHandle);
  Self.mmo1.Lines.Add(‘已成功关闭内存映射文件!‘);
end;

end.

原文地址:https://www.cnblogs.com/tobetterlife/p/12161991.html

时间: 2024-10-13 22:22:54

内存映射 读和写的相关文章

JAVA NIO 内存映射(转载)

原文地址:http://blog.csdn.net/fcbayernmunchen/article/details/8635427 Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当

Java NIO内存映射---上G大文件处理

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果. 一.java中的内存映射IO和内存映射文件是什么? 内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快.加载内存映射文件所使用的内存在Java堆区之外.Java编程语言

Java NIO内存映射---上G大文件处理(转)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果. 一.java中的内存映射IO和内存映射文件是什么? 内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快.加载内存映射文件所使用的内存在Java堆区之外.Java编程语言

JAVA NIO之浅谈内存映射文件原理与DirectMemory

Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数  read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然后再把数据从内核IO缓冲区拷贝到进程的私有

NIO之内存映射文件原理

原文链接:https://www.cnblogs.com/lyftest/p/6564547.html Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数  read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然

内存映射实现进程通讯

unit FileMap; interface uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  StdCtrls, Dialogs; type  //定义TFileMap类  TFileMap = class(TComponent)  private    FMapHandle: THandle; //内存映射文件句柄    FMutexHandle: THandle; //互斥句柄    FMapN

底板芯片组与内存映射(Motherboard Chipsets and the Memory Map) 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4194650.html 底板芯片组与内存映射 我打算写一些关于计算机内部构造(computer internal)的博文(post),以解释现代操作系统内核是如何工作的.希望对一些在这方面没有经验,又感兴趣的程序员和爱好者(enthusiasts and programmers)提供些帮助.这些博文主要关注于Linux,Windows,以及Intel处理器.计算机的内部构造是我的兴趣之一.我曾经写过一些类

hbase内存规划(读多写少型和写多读少型)

//简单说来主要包括读多写少型和写多读少型),内存的相关配置却完全不同. 1.针对不同应用场景,对多种工作模式下的参数进行详细说明,并结合相关示例对集群规划中最核心模块-内存规划进行介绍.2.HBase中内存规划直接涉及读缓存BlockCache.写缓存MemStore,影响系统内存利用率.IO利用率等资源以及读写性能等,重要性不言而喻.3.主要配置也是针对BlockCache和MemStore进行,4.然而针对不同业务类型(简单说来主要包括读多写少型和写多读少型),内存的相关配置却完全不同.5

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动)

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动) 2015-02-22 李海沿 刚刚我们实现了linux系统内存的分配,读写,释放功能,下面,我们一鼓作气将IO端口映射及IO内存映射搞定,加油! (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存.BIOS等).在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址