探讨下在Delphi里面进程之间的数据共享
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。现在小编就和大家来探讨一下在Delphi里面进程之间的数据共享吧。
一、动态链接库
DLL(即动态链接库),是Dynamic Link Library的缩写形式,它是一个包含可由多个程序同时使用的代码和数据的库。除此之外,它还是实现代码重用的重要手段,创建Windows应用程序。那么问题就来了?当我们需要在进程之间共享数据的时候,应该如何做才可以最简单最快速的将其实现出来呢?如果大家还不知道方法的话,那就跟着小编一起来学习吧。
不知道大家是否知道,在32位应用系统里面,每一个应用程序都会把DLL映射到自己的地址空间里面,同一时间DLL里面的数据也就随之被映射(两个元素的集之间元素相互"对应"的关系)了。这样子操作的话,每一个应用程序都会拥有属于有自己的一个数据实例。当然啦,我们在一个应用程序里面修改DLL中的全局变量,这样子是并不会影响到其它应用程序的。大家是不是觉得,DLL的使用好像和我们要实现的目的有点相背离呢?其实小编也是这样认为,那么怎样才可以真正的实现到我们想要的东西呢?大家想到方法了吗?如果还没有,不妨尝试一下小编的建议吧。在这里,小编要为大家介绍一种技术,那就是内存映射文件,这是一种较为特殊的方法哟,到底有多特殊,现在就来看一看吧。
二、内存映射文件
内存映射文件,是由一个文件到一块内存的映射,内存映射文件与虚拟内存有些类似。在内存映射文件中,为用户提供了一种非常好使的方法。这种方法就是在WIN32系统的地址空间里面,将一块内存区域保留出来,然后物理存储就可以向其中进行提交。另外一个方面,内存映射文件不仅仅只是WIN32的页面文件,还可以是一个磁盘文件。小编认为这两者之中,前者要比后者好用,因为这样子就意味着大家可以像访问一个磁盘文件那样访问内存里面的一个区域了。然而我们再也不需要使用创建一个临时文件,当它用完了以后还得需要将其删除。在WIN32里面就拥有着自己的管理页面调度文件,当大家不需要页面调度文件的时候,系统就会自动将全部有关的区域释放。
三、实现方法
那么接下来小编就向大家演示一下实现方法吧,在这一段编程代码中小编还特意写了注释,希望这对大家有所帮助。另外一个方面,这一个示范例子是在DELPHI6里面编译通过,所以大家一定要注意咯。编程代码如图所示:
- library Project1;
- uses
- shareMem,
- windows,
- SysUtils,
- Classes;
- const
- MFileName: Pchar = ’ShareData’;
- //定义一个记录类型,你所需要共享的数据就保存在这里。
- //当在进程中调用GetDllData时,进程中也应该定义一个与这个一样的记录类型。
- type
- PGlobalDllData = ^TGlobalDllData;
- TGlobalDllData = record
- s: string[50];
- i: integer;
- end;
- var
- GlobalData: PGlobalDllData; //这是一个全局变量,指向创建的内存映射文件。
- MapHandle: THandle;
- //给外部进程调用的过程,当外部进程调用这个过程后,形参AGlobalData就指向了我
//们创建的内存映射文件. 我们可以创建两个进程, 同时调用这个过程, 那么在其中一个进 //程中修改数据后, 在另外一个进程中既可反应出来, 实现了我们需要的共享. - procedure GetDllData(var AGlobalData: PGlobalDllData);stdcall; begin
- AGlobalData := GlobalData;
- end;
- procedure OpenThisData;
- var
- size: integer;
- begin
- size := sizeof(TGlobalDllData);
- //创建一个内存文件映射对象,MfileName保存的值就是该对象的名字。
- mapHandle := CreateFileMapping(Dword(-1), nil, page_readWrite, 0, size, MFileName);
- if mapHandle = 0 then
- RaiseLastWin32Error;
- //把文件的视图映射到调用进程的地址空间,该函数的返回值就是该对象的首地址。注//意,这是调用进程的地址,两个应用程序调用该DLL,返回值是不一样的。
- GlobalData := MapViewOfFile(mapHandle, File_map_all_Access, 0, 0, size);
- Globaldata^.s := ’TEST’;
- GlobalData^.i := 5;
- if GlobalData = nil then
- begin
- CloseHandle(MapHandle);
- RaiseLastWin32Error;
- end;
- end;
- //DLL从进程中分离出来时,应该释放相应的空间
- procedure CloseThisData;
- begin
- unmapViewOfFile(GlobalData);
- closeHandle(MapHandle);
- end;
- procedure DllEntryPoint(dwReason: DWord);
- begin
- case dwReason of
- Dll_Process_Attach: OpenThisData; //调用DLL时传入的参数,由系统自动传入
- Dll_Process_Detach: CloseThisData; //释放DLL时传入的参数,系统自动传入。
- end;
- end;
- {$R *.res}
- exports
- GetDllData; //外部应用程序调用的就是这个过程。
- begin
- DllProc := @DllEntryPoint; //该变量是一个全局变量,由它来指定DLL的入口及出 //口函数。
- DllEntryPoint(Dll_Process_Attach);
- end.
小编结语:
通过这篇编程语言教程,不知道大家是否已经学会了在Delphi里面进程之间的数据共享呢?在这篇教程中,主要就是向大家介绍一下数据共享。希望这对大家有所帮助。
探讨下在Delphi里面进程之间的数据共享的更多相关文章
- 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池
一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...
- 进程之间的数据共享 -----Manager模块
展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据. 这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分布式系统中 ...
- manager 实现进程之间的数据共享 list dict
manager 能够实现进程之间的数据共享 (list,dict) 如果多个进程同事修改同一份共享数据,这个时候需要加锁,保证数据的准确性. (1) dict list 可以实现进程之间的数据共享 ( ...
- 【Linux 进程】之关于父子进程之间的数据共享分析
之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...
- python 进程之间的数据共享
from multiprocessing import Process,Manager import os def f(d,n): d[os.getpid()] = os.getppid()#对字典d ...
- python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726
进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...
- python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- python全栈开发day33-进程间的通信、进程间的数据共享,进程池
一.昨日内容回顾: 1. 守护进程 1).p.saemon, 2 ).p.terminate 3 ).p.join 2. 同步控制 1).锁,Lock 互斥锁,解决数据安全.进程之间资源抢占问题. ...
- python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
随机推荐
- [Android UI]View滑动方式总结
一.前言 在上一篇文章,介绍了View的坐标等基础知识,有了基础知识后,对下面内容的理解也将会容易很多.那么本文介绍的是View滑动的几种方式,这对于View来说,也是需要重要掌握的内容,因为用户无时 ...
- 数据结构4.3_字符串模式匹配——KMP算法详解
next数组表示字符串前后缀匹配的最大长度.是KMP算法的精髓所在.可以起到决定模式字符串右移多少长度以达到跳跃式匹配的高效模式. 以下是对next数组的解释: 如何求next数组: 相关链接:按顺序 ...
- 1040 有几个PAT (25 分
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...
- 1065. A+B and C (64bit) (20)
Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C. Input S ...
- dedecms中模板函数
下面来解说下DEDECMS织梦CMS模板里面的函数说明 在文件include/inc_function.php里面 1 2 GetCurUrl() 获贴切前的脚本的URL 1 2 GetAlabNum ...
- 练习六十七:HTML练习
题目:一个html文件,找出里面的链接 代码: from html.parser import HTMLParser import urllib.request class myhtml(HTMLPa ...
- 一行CMD命令kill(杀)掉你的进程
查看进程 pi@raspberry:~ $ ps -ef | grep python3 UID PID PPID C STIME TTY TIME CMD pi 4678 4666 0 11:57 p ...
- Centos6.10搭建Hadoop三节点分布式
(一)安装JDK 1. 下载JDK,解压到相应的路径 2. 修改 /etc/profile 文件(文本末尾添加),保存 sudo vi /etc/profile # 配置 JAVA_HOME exp ...
- Caused by: java.net.URISyntaxException: Relative path in absolute URI
<property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> ...
- mysql中操作符LIKE与通配符%的使用
mysql中通配符%用来通配其他字符,操作符LIKE用来查询字段中存在相同的字符 SELECT t.userId,t.cellphone,t.idNo,t.* FROM t_person t WHER ...