zoukankan      html  css  js  c++  java
  • C++ 共享内存 函数封装

     1 #pragma once
     2 #include <string>
     3 #include <wtypes.h>
     4 #include <map>
     5 
     6 using namespace std;
     7 
     8 #define  MEMORYSIZE 102400000 //每块内存的大小
     9 
    10 struct MemoryAddr{
    11     string StrName;
    12     LPVOID pBuffer;    
    13     HANDLE m_Handle;
    14 };
    15 
    16 class SharedMemory
    17 {
    18 public:
    19     SharedMemory(void);
    20     ~SharedMemory(void);
    21 public:
    22     string strMapName;                // 内存映射对象名称
    23     string strComData;        // 共享内存中的数据
    24     int MemoeryNum; //开辟内存数
    25 
    26     map<int,MemoryAddr>MemoryInfo;
    27 
    28     LPVOID Init(string MeName);
    29     void   IntPutData(string MeName,string str);
    30     string OutPutData(string MeName);
    31     string GetAllData();
    32 };
     1 #include "StdAfx.h"
     2 #include "SharedMemory.h"
     3 
     4 
     5 SharedMemory::SharedMemory(void)
     6 {
     7     MemoeryNum=0;
     8 }
     9 
    10 SharedMemory::~SharedMemory(void)
    11 {
    12     map<int,MemoryAddr>::iterator it;
    13 
    14     for (it=MemoryInfo.begin();it!=MemoryInfo.end();it++)
    15     {        
    16         ::UnmapViewOfFile(it->second.pBuffer);
    17         ::CloseHandle(it->second.m_Handle);
    18     }
    19 
    20     MemoryInfo.clear();
    21 }
    22 
    23 LPVOID SharedMemory::Init( string MeName)
    24 {
    25     MemoryAddr mMemoryAddr;
    26     LPVOID pBuffer;
    27     // 首先试图打开一个命名的内存映射文件对象  
    28     HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, MeName.c_str());
    29 
    30     if (NULL == hMap)
    31     {    // 打开失败,创建之
    32         hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,MEMORYSIZE,MeName.c_str());
    33         // 映射对象的一个视图,得到指向共享内存的指针,设置里面的数据
    34         pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    35     }
    36     else
    37     {    // 打开成功,映射对象的一个视图,得到指向共享内存的指针,显示出里面的数据
    38         pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    39     }
    40     
    41     mMemoryAddr.StrName=MeName.c_str();
    42     mMemoryAddr.pBuffer=pBuffer;
    43     mMemoryAddr.m_Handle=hMap;
    44 
    45     MemoryInfo.insert(pair<int,MemoryAddr>(MemoeryNum,mMemoryAddr));
    46 
    47     MemoeryNum++;
    48 
    49     return pBuffer;
    50 }
    51 
    52 void SharedMemory::IntPutData(string MeName, string str )
    53 {
    54     map<int,MemoryAddr>::iterator itr;
    55     for (itr=MemoryInfo.begin();itr!=MemoryInfo.end();itr++)
    56     {
    57         if (MeName==itr->second.StrName)
    58         {
    59             strcpy((char*)itr->second.pBuffer, str.c_str());
    60         }
    61     }
    62 }
    63 
    64 std::string SharedMemory::OutPutData(string MeName)
    65 {
    66     map<int,MemoryAddr>::iterator iter;
    67 
    68     for (iter=MemoryInfo.begin();iter!=MemoryInfo.end();iter++)
    69     {
    70         if (iter->second.StrName==MeName)
    71         {
    72             return (char*)iter->second.pBuffer;
    73         }
    74     }
    75 }
    76 
    77 std::string SharedMemory::GetAllData()
    78 {
    79     string str="";
    80     map<int,MemoryAddr>::iterator ir;
    81     for (ir=MemoryInfo.begin();ir!=MemoryInfo.end();ir++)
    82     {
    83         string strTemp="";
    84         strTemp.append(ir->second.StrName);
    85         strTemp.append(":");
    86         strTemp.append((char*)ir->second.pBuffer);
    87         str.append(strTemp.c_str());
    88         str.append(",");
    89     }
    90     return str;
    91 }
  • 相关阅读:
    Tensorflow的对二次函数的神经网络训练
    ubuntu16.04的Anaconda下的tensorflow安装py3.5
    数字信号处理C语言(3) ------FFT
    数字信号处理C语言(2) ------带高斯噪声的sin函数和组合sin函数
    数字信号处理C语言(1) ------均匀分布和高斯分布随机数
    CCIE学习笔记 ----TSHOOT
    CCIE学习笔记 ----BGP
    CCIE学习笔记 ----GRE over IPsec
    调试
    Java protobuf框架使用向导
  • 原文地址:https://www.cnblogs.com/xuandi/p/5673917.html
Copyright © 2011-2022 走看看