社区
进程/线程/DLL
帖子详情
一个关于内存共享的问题!现在高分求教思路。进来都有分!UP有分!不够再加!!
hdp4820
2004-03-16 03:06:04
就是两个一样的进程。
都要对内存进行读写。
不过现在的目的就是只一个进程写进去就行了。
另一个进程来就可以直接调用,不用再写了。
就是实现内存共享。
不知道哪位兄台能够给点意见或者一些大致的代码之类的。
...全文
29
9
打赏
收藏
一个关于内存共享的问题!现在高分求教思路。进来都有分!UP有分!不够再加!!
就是两个一样的进程。 都要对内存进行读写。 不过现在的目的就是只一个进程写进去就行了。 另一个进程来就可以直接调用,不用再写了。 就是实现内存共享。 不知道哪位兄台能够给点意见或者一些大致的代码之类的。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
longge520
2004-03-16
打赏
举报
回复
内存映射文件
ymbymb
2004-03-16
打赏
举报
回复
同意用存储映射文件共享内存
hdp4820
2004-03-16
打赏
举报
回复
谢谢各位了,
一会再给分!
fromv
2004-03-16
打赏
举报
回复
在Windows操作系统下,任何一个进程不允许读取、写入或是修改另一个进程的数据(包括变量、对象和内存分配等),但是在某个进程内创建的文件映射对象的视图却能够为多个其他进程所映射,这些进程共享的是物理存储器的同一个页面。因此,当一个进程将数据写入此共享文件映射对象的视图时,其他进程可以立即获取数据变更情况。为了进一步提高数据交换的速度,还可以采用由系统页文件支持的内存映射文件而直接在内存区域使用,这种共享内存的方式是完全可以满足在进程间进行大数据量数据快速传输任务要求的。
在发送方程序中,首先通过CreateFileMapping()函数创建一个内存映射文件对象,如果创建成功则通过MapViewOfFile()函数将此文件映射对象的视图映射进地址空间,同时得到此映射视图的首址。
两个函数原形声明如下:
HANDLE CreateFileMapping(HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName);
LPVOID MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
CreateFileMapping()函数参数hFile指定了待映射到进程地址空间的文件句柄,如果为无效句柄则系统会创建一个使用来自页文件而非指定磁盘文件存储器的文件映射对象。很显然,在本例中为了数据能快速交换,需要人为将此参数设定为INVALID_HANDLE_VALUE;参数flProtect设定了系统对页面采取的保护属性,由于需要进行读写操作,因此可以设置保护属性PAGE_READWRITE;双字型参数dwMaximumSizeHigh和dwMaximumSizeLow指定了所开辟共享内存区的最大字节数;最后的参数lpName用来给此共享内存设定一个名字,接收程序可以通过这个名字将其打开。MapViewOfFile()函数的参数hFileMappingObject为CreateFileMapping()返回的内存文件映像对象句柄;参数dwDesiredAccess再次指定对其数据的访问方式,而且需要同CreateFileMapping()函数所设置的保护属性相匹配。这里对保护属性的重复设置可以确保应用程序能更多的对数据的保护属性进行有效控制。
数据的传送实际是将数据从发送方写到共享内存中,然后由接收程序及时从中取走即可。数据从发送方程序写到共享内存比较简单,只需用memcpy()函数将数据拷贝过去,关键在于能及时通知接收程序数据已写入到共享内存,并让其即使取走。在这里仍采取消息通知的方式,当数据写入共享内存后通过PostMessage()函数向接收方程序发送消息,接收方在消息响应函数中完成对数据的读取。
当数据传输结束,即将退出程序时,需要将映射进来的内存文件映射对象视图卸载和资源的释放等处理。这部分工作由UnmapViewOfFile()和CloseHandle()等函数完成.
当发送方程序将数据写入到共享内存后,接收方将收到消息WM_DATA_READY,在响应函数中将数据从共享内存复制到本地缓存中,再进行后续的处理。同发送程序类似,在接收程序数据接收完毕后,也需要用UnmapViewOfFile()、CloseHandle()等函数完成对文件视图等打开过资源的释放。
robinzo
2004-03-16
打赏
举报
回复
GZ
hdp4820
2004-03-16
打赏
举报
回复
现在要做的是两个可能很大的进程。
要在服务器上都要进行同样的操作。
就是写和读都是一样的,如果内存不够时。
这样的话就会可能造成延时!或者程序出错。
所以现在就是要写一个程序。来使得这两和在服务器上进行操作的进程只要一次渎写就够了。两个进程一模一样。
vcforever
2004-03-16
打赏
举报
回复
若要使用内存映射文件,必须执行下列操作步骤:
1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件。
2) 创建一个文件映射内核对象,告诉系统该文件的大小和你打算如何访问该文件。
3) 让系统将文件映射对象的全部或一部分映射到你的进程地址空间中。
当完成对内存映射文件的使用时,必须执行下面这些步骤将它清除:
1) 告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。
2) 关闭文件映射内核对象。
3) 关闭文件内核对象。
调用CreateFile函数,就可以将文件映像的物理存储器的位置告诉操作系统。你传递的路径
名用于指明支持文件映像的物理存储器在磁盘(或网络或光盘)上的确切位置。这时,必须告
诉系统,文件映射对象需要多少物理存储器。若要进行这项操作,可以调用CreateFileMapping函数:
第一个参数hFile用于标识你想要映射到进程地址空间中的文件句柄。该句柄由前面调用的
CreateFile函数返回。psa参数是指向文件映射内核对象的SECURITY_ATTRIBUTES结构的指针,
通常传递的值是NULL(它提供默认的安全特性,返回的句柄是不能继承的)
当创建了一个文件映射对象后,仍然必须让系统为文件的数据保留一个地址空间区域,并
将文件的数据作为映射到该区域的物理存储器进行提交。可以通过调用MapViewOfFile函数来
进行这项操作:
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap
);
步骤4:从进程的地址空间中撤消文件数据的映像
当不再需要保留映射到你的进程地址空间区域中的文件数据时,可以通过调用下面的函数将它释放:
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress
);
步骤5和步骤6:关闭文件映射对象和文件对象
当你的进程终止运行时,系统会自动关闭你的进程已经打开但是忘
记关闭的任何对象。但是如果你的进程暂时没有终止运行,你将会积累许多资源句柄。因此你
始终都应该编写清楚而又“正确的”代码,以便关闭你已经打开的任何对象
szclm
2004-03-16
打赏
举报
回复
希望这个对你有用:
http://www.csdn.net/develop/read_article.asp?id=17570
nik_Amis
2004-03-16
打赏
举报
回复
up
软考
高
项论文50分秘籍——心法篇
讲师以52分和53分通过论文,2次
高
分通过,方法论经得起考验
基础
各位兄弟,在SDK编程中如果实现窗口分割呢?请问怎么得到一个函数的执行时间,单位毫秒!如何调试asp组件呀。用vc++调试编制的组件怎样画一个箭头?
高
分请教如何限制程序...有了该
问题
就有了思考(100分 献礼!)如何
WEB开发文档2 总结
http://blog.donews.com/lvjiyong/archive/2006/06/29/931071.aspx怎样将后台生成的在
内存
中的图象显示到客户端Microsoft IE WebControls下载地址如何在DATAGRID中使用JAVASCRIPT脚本控制DataGrid中连接到下一页显示...
MS-SQL Server 基础类 - SQL语句
一个关于case语句的
问题
sql server怎么跨库查询? 如何判断字符的大小写? 如何得到动态SQL中取得的值? 如何定义动态游标? 已知:当前时间(截取yyyy-mm) 目标1:查询进销存表当中距离当前时间连续3个月内进货数量=0....
CSDN回帖得分大全(近两年)
一个关于利用WinInet和网站通信的
问题
[VC/MFC 网络编程] √ 如何得知我写的注入dll是否被调试软件调试? [VC/MFC 基础类] √ 关于初级dll编写的
问题
[VC/MFC 基础类] √ ...
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章