zoukankan      html  css  js  c++  java
  • 共享内存——没有句柄的两个地方互传数据

      一直对匿名管道这个名字有着相当的兴趣,然而至今没有完全弄明白匿名管道的原理,可能本人的记忆属于感觉型的,没有经历过的东西印象始终不深,以至于一些技术虽然当时理解了,一段时间之后使大抵的都忘了。

    现在有一种更简单,且觉得相当实用的数据传递方法,记录下来以加深记忆。

    共享内存

      其实微软件的sendmessage、postmessage内部实现也使用了内存共享技术,该技术初衷是用于解决大文件的频繁读写操作,通过创建一个内核对象的方式,将文件直接映射在内存中,并且提交物理内存到该内存空间,如此一来省去了读写的I/O操作,也不需要为文件开辟缓冲区域。多个进程可以打开该文件内核(内存)进行操作。

      这里的用法是创建一个文件无关的文件内存映射,来进行数据交换,如此一来有一块内存是共享的,在不同的进程中都可以读写,相当的方便。

      与匿名管道类似,没有同步驱动机制。但是这一点可以通过写入窗口句柄之后,再使用sendmessage、postmessge等方式协调的完成整个过程。

      贴出部分代码,大家共勉

    1.创建部分

    HANDLE m_hShareHandle = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,dwMapSize,_T("Share"));//创建一个共享内存
    if(m_hShareHandle)
    {
      m_lpShare = MapViewOfFile(m_hShareHandle,FILE_MAP_WRITE,0,0,dwMapSize);//为该内存为分配空间
      if(m_lpShare)
      {
        char* pBuff = ...//ur code
        strncpy((char*)m_lpShare,pBuff,strHandle.GetLength());//向其中写入数据
        delete []pBuff;
      }    
    }

    2.接收部分

         HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,_T("Share"));//打开共享内存
            if(hMap)
            {
                char *lp = (char*)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);//读该内存
    
            ....//ur code
    UnmapViewOfFile(lp); CloseHandle(hMap);//关闭内存映射
     } return S_OK;

    文件无关的使用方式如此即可。涉及文件读写的,后续更新了吧 多半随缘了 : )

  • 相关阅读:
    跨域是什么
    【剑指offer】05-替换空格
    【剑指offer】04-二维数组中的查找
    【剑指offer】03-变态跳台阶
    【剑指offer】02-青蛙跳台阶
    【剑指offer】01-斐波那契数列
    python面向对象-类和实例
    LibreOffice字体问题解决;从window复制到Ubuntu
    Far manager界面混乱问题解决
    Ubuntu-18.04.2-几个启动错误解决办法
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/11904364.html
Copyright © 2011-2022 走看看