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

Delphi XE使用共享内存进行高速数据共享 Windows系统共享数据的方法很多,包括:管道、DDE、Socket、文件系统、再就是共享内存进行数据通信,方便高速,可以说是以上方案的最优选择。 共享端代码如下: {共享内存专用} memmap : array[0..60000] of single; //内存数据 pmem : Pointer; //共享内存指针 shareName : s 阅读详情

一.原理

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

二.主要操作

    共享内存结构:

  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,

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


出自:http://www.cnblogs.com/python001/

61、内存映射文件在Delphi中的应用 本文详细介绍了内存映射文件在Delphi中的应用,涵盖其基本概念、创建与使用方法、读写操作以及在进程间通信中的具体实现。同时,通过实际案例和优化策略探讨了内存映射文件的性能优势,并通过性能测试验证了其高效性。 阅读详情

相关推荐

Delphi进程间内存共享编程实战

进程间通信是一种允许运行在同一台机器上的不同进程进行数据交换与同步的技术。在Delphi中,进程间通信可以实现多种功能,例如,客户端和服务器之间的信息交换、分布式系统组件间的协作,以及模块化应用程序中的服务共享。IPC对于开发可扩展、模块化以及能够处理并发操作的现代应用程序至关重要。内存共享技术,是指在操作系统中,允许两个或两个以上的进程访问同一块内存区域,实现数据共享。这通常是通过将一块物理内存映射到多个进程的地址空间来实现的。

weixin_42613018的博客 480

Delphi如何实现内存共享

原文来自: http://my.oschina.net/pc100/blog/380956 一.原理 通过使用“内存映射文件”,实现内存共享 二.主要操作 共享内存结构: PShareMem=^TShareMem; TShareMem=Record id:string[10]; name:string[20]; age...

weixin_30426957的博客 434

Delph/XE如何应用共享内存映射文件(源代码)

通过使用“内存映射文件”,实现内存共享 代码包含如何定义共享的内存结构、如何创建共享内存映射文件、如何多程序调用共享内存映射文件、如何由非创建方程序来释放共享内存映射文件

内存映射、共享内存

内存映射、共享内存

bsp_mrLI的博客 419

DELPHI 内存映射共享内存

两个EXE之间共享内存传递数据,喜欢的DELPHI的朋友可以下载学习下

Autosar开发实战:DaVinci Configurator Pro新建工程保姆级教程(附目录结构解析)

本文详细介绍了使用DaVinci Configurator Pro创建Autosar工程的完整流程,包括环境准备、工程配置、目录结构解析及常见问题排查。通过实战演示和深度解读,帮助开发者快速掌握工具使用技巧,优化工程管理,提升开发效率。特别适合需要理解Autosar开发中DaVinci Config工具链的工程师。

weixin_30872157的博客 458

Delphi 内存映射实现两个进程间通信

写入方代码 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type PShareMem = ^TShareMem; TShareMem = Record id:strin...

黑色小番茄的博客 941

内存优化--LOGBACK导致内存告警

一.故事背景 由于开辟新市场需要,开发了新的项部署在海外平台,其中最消耗内存的功能是消费kafka消息(最开始预计一天有1千万的量),部署完之后运行一段时间发现出现内存告警问题。 二.分析问题 出现内存告警,(新项目是低配置机器 2C4G * 2台)第一个念头是去查看堆空间设置的情况,看到jvm启动命令中堆空间都是直接指定大小,说明问题不是出在堆空间 -Xmx3g -Xms3g 先不管这些,去查看总的内存使用情况,发现总的内存空间使用将近有92% = 3.68G,那么这多出来使用的0.6

qq_33199919的博客 6052

内存映射与共享内存

内存映射与共享内存 一、 内存区域管理 从前面的分析我们已经大概清楚了,内核在进行虚拟内存管理的时候,是以内存“区域”这个概念来进行的,下面我们就来详细解读一下内核是如何管理区域的呢,包括区域的组织、创建、查找等。 1.1 数据结构 内核使用struct vm_area_struct结构体来描述内存区域,每一个独立的内存区域都有一个对应的实例。内核中进程的虚拟地址空间是使用struct mm_struct结构体来描述的,所以内存区域的管理也是靠这个结构体的,其中相关的字段包括: struct mm_stru

qq_17045267的博客 5278

Brainstorm简单分析近红外数据(fNIRS)(一)

Brainstorm分析fNIRS数据

weixin_43604817的博客 1352

【IPAM】Netbox docker模式版本升级

NETBOX 是一个开源的网络资源管理系统,主要用于管理 IP 地址、机架、设备、接口等网络资源信息。下面是 NETBOX 的功能、优点和缺点的详细介绍。

u012153104的博客 1329

delphi 实现两个exe文件共享内存映像的代码

创建内存映像的程序 -------------------------------------------------------------------------------------------- unit Unit1; interface uses   Winapi.Windows, Winapi.Messages, System.SysUtils, Syste

Hmillet的专栏 1181

DeepSeek Harness桌面版安装教程:从零配置到实用插件推荐

在AI编程工具逐步普及的今天,开发者越来越关注如何将大模型能力无缝融入日常编码流程。这类工具的核心在于构建一个连接模型服务与本地开发环境的中间层,通过项目级上下文理解、终端指令执行和插件机制,让AI真正成为能动手干活的编程副驾驶。安装配置过程中,环境准备、模型服务连接与工具权限设置是三个关键环节。完成基础搭建后,选择合适的插件能显著提升代码质量与问题排查效率,例如基于代码审查的规范对齐和安全扫描,以及面向运行时日志关联分析与性能告警的诊断工具。本文以DeepSeek Harness桌面版为例,从环境自查、安

weixin_31286719的博客 312

delphi 内存映射

使用内存映射文件读写大文件 使用内存映射文件读写大文件  文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类。一般来说,这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。使用字符串变量的方法不仅会加重内存的负担,而且会Unicode和A...

dkopg24406的专栏 647

基于深度学习的图像去雨(Opencv,Pytorch,Cnn)

最近做了一个图像去雨项目,使用的语言为Python,深度学习框架为Pytorch。去雨效果不错,具体请看效果视频!图像去雨(GAN,Opencv,Pytorch)

Czqqwer的博客 2612

MATLAB 车牌识别系统

车牌识别系统利用计算机视觉和图像处理技术,自动识别车辆牌照上的字符信息。本系统基于 MATLAB 实现车牌识别,包括图像预处理、车牌定位、字符分割、字符识别等模块。车牌识别系统是实现智能交通和公共安全的重要手段,具有广泛的应用前景。MATLAB 提供了丰富的工具和函数,可以方便地进行算法仿真和系统开发。

走向CTO的路上... 724

Delphi内存映射文件例子

unit  FileMap;   interface   uses     Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,StdCtrls,Dialogs;   type     TFileMap=class(TComponent)     private         FMapHandle:THandle;         

裸奔的蜗牛的专栏 4831

【占用网络】OccNet: Scene as Occupancy 适用于检测、分割和规划任务 ICCV2023

本文分享“占用网络”方案中,具有代表性的方法:OccNet。它以多视角视觉为核心,首先生成BEV特征,然后通过级联结构和时间体素解码器重建生成3D占用特征。构建一个通用的“3D占用编码特征”,用以表示3D物理世界。这样的特征描述可以应用于广泛的自动驾驶任务,包括检测、分割和规划。

黎国溥 3361

delphi的内存映射与映射数据获取

elphi的内存映射与映射数据获取 1.定义数据结构 type //外部接口结构 内外部结构需一至 PBM_Interface = ^TBM_Interface; TBM_Interface = record UserID:Integer; //登陆用户ID UserName: string; //登陆用户姓名 end; ================================================================ 2.调用创建映射的函数

yygyyygy1233的博客 752

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

内存映射文件进程间共享内存

内存映射文件进程间共享内存   内存映射文件的另一个功能是在进程间共享数据,它提供了不同进程共享内存的一个有效 且简单的方法。后面的许多例子都要用到共享内存。 共享内存主要是通过映射机制实现的。 Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的。所谓的重 叠是指同一块内存区域可能被多个进程同时使用。当调用Crea

jiht594的专栏 4416

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

共享内存-内存映射

使一个磁盘文件与内存中的一个缓冲区相映射,进程可以像访问普通内存一样对文件进行访问,不必再调用read,wrid。mmap()的优点:实现了用户空间和内存空间的高效交互方式。

2201_75441920的博客 507

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

浅谈Delphi中进程间的数据共享

  DLL是创建Windows应用程序,实现代码重用的重要手段。那么当我们需要在进程间共享数据时,怎样做才能快捷方便地实现呢?在32位应用系统中,每个应用程序会将DLL映射到自己的地址空间,同时DLL中的数据也就随之被映射了。这样,每个应用程序都有自己的数据实例,在一个应用程序中修改DLL中的全局变量,不会影响其它的应用程序。DLL的使用似乎与我们的目的...

a572893208的博客 247

Delphi 内存映射

Delphi 示例: //创建内存映射 var   str,strA,strB,FA,FB:string;   pstr:pchar;   pp:^pansichar;   hma,hmb:THandle;  begin   self.WindowState:=wsmaximized;   //创建及拷贝数据到共享文件   strA:='AA193';   strB:

ChimHsiung 专栏 780

Delphi内存映射文件例子 .

unit  FileMap;    interface    uses     Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,StdCtrls,Dialogs;    type     TFileMap=class(TComponent)     private         FMapHand

YanJinrong的专栏 1542

day12 共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)

功能共享内存可以通过mmap()映射普通文件。是一个磁盘文件与内存中的一个缓冲区相映射,进程可以像访问普通内存一样对文件进行访问,不必在调用read 、write。实现了用户空间和内核空间的高效交互方式;功能:创建共享内存映射;函数返回值:成功返回创建的映射区首地址,失败返回MAP_FAILED(((void*) -1)),设置error值;addr:指定要映射 的内存地址,一般设置为NULL 让操作系统选择合适的内存地址。length:必须 > 0。

m0_58066972的博客 542
上一篇: PHP字符串函数汇总
下一篇: 在Delphi中操作注册表的方法
shao882
博客等级 码龄12年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值