windows共享内存api,windows 共享内存

1.进程逻辑空间和物理空间

如上图所示,每个进程都有自己的逻辑空间,这些逻辑空间被映射到具体的物理空间。

各个进程的逻辑空间是相互分离、相互独立、不间断的。

然而,它们都映射到同一个物理空间,如果映射的物理空间重叠,则重叠部分共享物理内存。

2. 共享内存的主要问题

创建物理内存

将物理内存映射到进程空间

读写控制互斥

1)创建物理内存并获取物理内存资源句柄。

例如,进程A负责创建共享内存。

A: 进程创建物理内存后,直接返回物理内存句柄。

//创建共享文件句柄HANDLE hMapFile=CreateFileMapping( INVALID_HANDLE_VALUE, //物理文件句柄NULL, //默认安全级别PAGE_READWRITE, //可读可写0, //高文件大小BUF_SIZE, //低文件大小L \\\’ ShareMemory \\\’ //共享内存名称);B:进程B通过共享内存全局名称获取共享物理内存句柄

//打开共享文件对象HANDLE hMapFile=OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,L\\\’ShareMemory\\\’);2) 物理内存映射进程空间

这样,每个进程就将物理空间中的共享内存映射到进程的逻辑空间中。

//映射缓存视图并获取指向共享内存的指针。 LPVOID lpBase=MapViewOfFile( hMapFile, //共享内存句柄FILE_MAP_ALL_ACCESS, //读写权限0, 0, BUF_SIZE );3) free

进程完成后取消映射

//取消文件映射

UnmapViewOfFile(lpBase);

//关闭内存映射文件对象句柄

关闭句柄(hMapFile);

4)互斥控制

使用互斥体或信号机制

互斥机制

进程A: 创建互斥体while(1) { 释放互斥体; 进程B: { 释放互斥体} 示例:

工艺A

#include #include using namespace std; int main(){//如果不存在,则创建名为“pmutex”的互斥体,否则获取其句柄。 HANDLE hMutex=CreateMutex(NULL, false, \\\’pmutex\\ \’) ); if(NULL==hMutex) { cout\\\’互斥体创建错误\\\’进程B

#include #include using namespace std; int main(){//如果不存在,则创建名为“pmutex”的互斥体,否则获取其句柄。 HANDLE hMutex=CreateMutex(NULL, false, \\\’pmutex\\ \’) ); if(NULL==hMutex) { cout\\\’创建互斥体时出错\\\’信号量机制:

进程A:执行写操作

进程A执行写操作//等待其他进程完成读操作WaitForSingleObject(m_memMng.m_hReadEvent, INFINITE) //重置写操作信号量ResetEvent(m_memMng.m_hWriteEvent) //Write 执行操作memcpy //写完后恢复操作完成,使信号量可由其他进程读取。 SetEvent(m_memMng.m_hWriteEvent); 进程B:执行读操作。

//进程B执行读操作。 //等待主进程写完。 WaitForSingleObject(m_memMng.m_hWriteEvent, INFINITE) //重置读取信号量。 ResetEvent(m_memMng.m_hReadEvent); //读操作,复制共享内存数据。局部变量memcpy中//一旦读操作完成,将信号量信号SetEvent(m_memMng.m_hReadEvent)设置为三个包。

必须存在的成员变量:

1)创建物理内存并映射进程空间管理

处理hMapping_;

MappedView View_; 操纵物理映射到进程空间

int 大小_;

std:wstring name_; 共享内存名称

2)信号量控制管理

处理m_hReadEvent。

处理m_hWriteEvent。

操作方法:

1)创建

bool CreateFileMap(); //创建

bool OpenFileMap(); //如果已经存在则打开。

bool MapView(bool bCanWrite=true); //映射进程空间。

2)映射管理类

class MappedView{public:MappedView() : view_(NULL) {}~MappedView() { CloseView(); }bool MapView(SharedMemory *shared_memory, bool can_write);//MapViewOfFilevoid CloseView();char *view() { return view_; } }private: char *view_=nullptr;};共享内存管理类

类SharedMemory{public:SharedMemory() : hMapping_(NULL) {size_=0;m_hReadEvent=NULL;m_hWriteEvent=NULL;}~SharedMemory() { Close(); if (m_hReadEvent) {CloseHandle(m_hReadEvent) }if (m_hWriteEvent)CloseHandle ( m_hWriteEvent);};public://InitReceiver 初始化(std:wstring name, std:wstring readName=L\\\’ShareMemoryReadEvent\\\’, std:wstring writeName=L\\\’ShareMemoryWriteEvent\\\’);//初始化接收器bool Init Create (std :w字符列名,int size, std:wstring readName=L\\\’ShareMemoryReadEvent\\\’, std:wstring writeName=L\\\’ShareMemoryWriteEvent\\\’); //初始化创建者private:bool CreateFileMap();bool OpenFileMap();bool MapView(bool bCanWrite=true);void Close() ; public:char* getData();int getSize(){return size_;}public://信号量管理void WaitForSingleObject_Read();void WaitForSingleObject_Write();void ResetEventNull_Read();void ResetEventNull_Write();void SetEvent_Read ();void SetEvent_Write( ) ; private:friend class MappedView;MappedView View_;HANDLE hMapping_=nullptr;int size_=0;std:wstring name_;public:HANDLE m_hReadEvent=nullptr;HANDLE m_hWriteEvent=nullptr;std:wstring m_ReadEvent tName; //跨进程信号量L \”Global “ std:wstring m_WriteEventName;};应用示例:

主进程发送摄像头数据

主进程SharedMemory m_memMng;m_memMng.InitCreate(L\\\’sharedCamera\\\’, 1920 * 1080 * 3/2 + 12);//0|1 状态+ 宽度+ 高度///////////////////////////////////////////////////////////////////char* pData=m_memMng.getData();INT32 nFps=g_pLiveForm-m_videoFps;INT32 nWidth=宽度;INT32 nHeight=高度;INT32 Info[]={ nFps, nWidth, nHeight };int len=sizeof( Info )/sizeof (Info[0]);if (pData){m_memMng.WaitForSingleObject_Read();m_memMng.ResetEventNull_Write();memcpy((INT32*)pData, Info, sizeof(INT32)*len);memcpy( pData + 12、nim_nls:LssManange: GetVideoFrameMng()-capture_video_pic_.pdata_, nim_nls:LssManange:GetVideoFrameMng()-capture_video_pic_.size_);m_memMng.SetEvent_W rite () ;} 子进程读取相机数据

sharedMemory m_memmng; m_memmng.initreceiver(l \\\’sharedCamera \\\’); //阅读m_memmng.waitforsingleobject_write() m_memmng.m_hread事件) );char* pData=m_memMng.getData();if (pData){INT32 nFps=20;INT32 nWidth=width_;INT32 nHeight=height_;INT32 Info[]={ 0, nWidth, nHeight };int len=sizeof ( 信息)/sizeof(信息[0]);memcpy(信息, (INT32*)pData, sizeof(INT32)*len);nFps=信息[0];nwidth=信息[1];nheight=信息[ 2 ]; memcpy ((char*)data_temp.c_str(), pData + 12, nWidth*nHeight * 3/2);m_memMng.SetEvent_Read(); //SetEvent(m_memMng.m_hReadEvent);

本文和图片来自网络,不代表火豚游戏立场,如若侵权请联系我们删除:https://www.huotun.com/game/667868.html

(0)
上一篇 2024年6月4日
下一篇 2024年6月4日

相关推荐

  • oppo和平精英声音设置? iPad和平精英声音设置?

    oppo和平精英声音设置? oppo手机的和平精英设置声音的话。打开游戏,点击右下角的设置按钮。右上角吧,.后滑动右侧的设置找到声音设置即可。 iPad和平精英声音设置? 打开和平精英里面的设置,在哪里面进行设置声音 和平精英ipad声音设置? 和平精英以及声音设置,可在和平精英PPT里面进行设置音量。 和平精英最好声音设置? 和平精英音效的最佳设置方法如下…

    游戏快讯 27分钟前
  • 和平精英单排操作设置和技巧?

    和平精英单排操作设置和技巧? 和平精英单排操作设置的话首先就是灵敏度这方面以及开火箭这方面根据每个人的喜好可以把灵敏度调到快活的滴,开火箭的话一定要对准。敌人。 和平精英单排怎么接单? 首先快速就会先改密码,游戏头像,玩家信任感需要很长时间去积累培养。出了任何问题,的进步。 时间要把握住。接单快捷安全。在自己孤身一人的情况下,做过代练的小伙伴都知道,渠道找到…

    游戏快讯 1小时前
  • VIVO手机玩和平精英卡不卡?

    VIVO手机玩和平精英卡不卡? 里面如果内存不够,玩的时候就会卡顿 32g手机怎么玩和平精英不卡? 32级的手机玩儿和平精英的话,会显得非常的卡, 如果你想要不卡的话,你需要把你手机上的其他软件全部卸载 ,只留qq和和平精英两个软件,这样就不卡,因为这样系统运行起来没有什么压力 。 小米civi玩和平精英卡不卡? 这款手机玩和平精英不卡。 这款机型采用骁龙7…

    游戏快讯 3小时前
  • 和平精英如何去掉超流畅?

    和平精英如何去掉超流畅? 打开设置点击画面调整 和平精英剪辑如何变得流畅? 要让和平精英剪辑变得流畅,需要注意以下几点: 剪辑的内容要有连贯性,不要出现断开或过渡不自然的情况; 场景的转换要合理,要考虑到剧情的紧凑性和逻辑性; 多运用一些剪辑技巧,例如跳剪、交错剪、渐变剪等,从而使得剪辑更加流畅。 剪辑师需要注意场景的选择和转换,同时掌握好剪辑技巧,才能使得…

    6小时前
  • 和平精英攻桥小技巧? 怎么下载国际服和平精英?

    和平精英攻桥小技巧? 1.在桥上找掩体与敌人交火 如果选择开车过桥,各位特种兵要选择有顶棚的载具,比如小轿车或者吉普车。这种车型在被敌人扫车的时候不容易被扫下来,相对于其他车型危险系数小一点。但是碰到敌人堵桥的情况下,就要在桥上有掩体的地方停车。一般在桥头桥尾桥中都会有废弃的卡车和一些箱子等,如果有人堵桥,这时候把车停到有掩体地方后,下车利用掩体和敌人交火。…

    游戏快讯 9小时前