C++共享内存模板

这是我写的一个能够使用共享内存的模板,匆忙书写,如有疏漏,望请改进,但要记得回复我改进的方法哦,谢谢!

-----------------------------------头文件---------------------------------------------

/***********************************************************************
* 共享内存类
* version:1.0
* 文件名:ShearMem.h
* 作者:常亮
* 时间:2011年3月28日3:36:59
* 功能:TShareMem模板可以共享内存中的保存传入的类,而且已做读写同步设置
* 大家可以随便使用,如有改进请发布新版本哦
************************************************************************/
#pragma once
#include <windows.h>
#define SHAREMEM_REQUESTREAD 0x01 // 请求读内存
#define SHAREMEM_READING 0x02 // 正在读内存
#define SHAREMEM_REQUESWRITE 0x04 // 请求写内存
#define SHAREMEM_WRITEING 0x08 // 正在写内存
#define OUTTIME  100   // 超时时间
#define READMEM_ONLYONE   // 是否只有一个线程读
template <class T> // 不要用指针
class TShareMem
{
public:
 TShareMem(TCHAR* pName)
 {
  m_hMapping = CreateFileMapping(  //创建一个有名的共享内存
   (HANDLE)0xFFFFFFFF, //0xFFFFFFFF表示创建一个进程间共享的对象
   NULL,
   PAGE_READWRITE,  //读写共享
   0,     // 共享区间高32位大小
   sizeof(SHORT)+sizeof(T),       //共享区间低32位大小
   pName);
  m_pMutex = (SHORT*)MapViewOfFile(  //映射到本进程的地址空间
   m_hMapping,
   FILE_MAP_READ|FILE_MAP_WRITE,
   0,
   0,
   0);
  m_pData = (T*)(m_pMutex+sizeof(SHORT));
 }
 ~TShareMem()
 {
  if (m_hMapping != NULL)
  {
   CloseHandle(m_hMapping);
   return;
  }
 }
private:
 HANDLE m_hMapping;
 SHORT* m_pMutex; // 共享内存的权限控制标志位指针
 T* m_pData; // 共享内存中的指针

public:
 BOOL UpdateMem(T data)
 {
  DWORD starttime = GetTickCount();
  DWORD endtime = starttime;
  while (TRUE)
  {
   // 状态:写入数据
   if (((*m_pMutex)&SHAREMEM_REQUESWRITE)  // 请求写
    && !((*m_pMutex)&SHAREMEM_WRITEING)  // 不在写
    && !((*m_pMutex)&SHAREMEM_REQUESTREAD) // 不请求读
    && !((*m_pMutex)&SHAREMEM_READING))  // 不在读
   {
    (*m_pMutex) |= SHAREMEM_WRITEING;
    (*m_pMutex) &= ~SHAREMEM_REQUESWRITE;
    (*m_pData) = data;
    (*m_pMutex) &= ~SHAREMEM_WRITEING;
    return TRUE;
   }
   // 状态:请求写的状态
   if (!((*m_pMutex)&SHAREMEM_REQUESWRITE)  // 不在读
    && !((*m_pMutex)&SHAREMEM_REQUESWRITE) // 不在请求写
    && !((*m_pMutex)&SHAREMEM_WRITEING)) // 不在写 
   {
    (*m_pMutex) |= SHAREMEM_REQUESWRITE;
    (*m_pMutex) &= ~SHAREMEM_REQUESTREAD;
   }
   // 超时
   endtime = GetTickCount();
   if ((endtime-starttime) > OUTTIME)
   {
    if ((*m_pMutex)&SHAREMEM_REQUESWRITE)
    {
     (*m_pMutex) &= ~SHAREMEM_REQUESWRITE;
    }
    return FALSE;
   }
  }
  return FALSE;
 };
 BOOL ReadMem(T& data)
 {
  DWORD starttime = GetTickCount();
  DWORD endtime = starttime;
  while (TRUE)
  {
   // 状态:读入数据
   if (((*m_pMutex)&SHAREMEM_REQUESTREAD) // 准备读
    && !((*m_pMutex)&SHAREMEM_WRITEING)  // 不在写
    && !((*m_pMutex)&SHAREMEM_READING)
    && !((*m_pMutex)&SHAREMEM_REQUESWRITE)) // 不请求写
   {
    (*m_pMutex) &= !SHAREMEM_REQUESTREAD;
    (*m_pMutex) |= SHAREMEM_READING;
    data = (*m_pData);
    (*m_pMutex) &= ~SHAREMEM_READING;
    return TRUE;
   }
   // 状态:请求写的状态
   if (!((*m_pMutex)&SHAREMEM_REQUESTREAD)  // 不是请求读
    && !((*m_pMutex)&SHAREMEM_READING)
    && !((*m_pMutex)&SHAREMEM_REQUESWRITE)
    && !((*m_pMutex)&SHAREMEM_WRITEING)) // 不在写
   {
    (*m_pMutex) |= SHAREMEM_REQUESTREAD;
   }
   // 超时
   endtime = GetTickCount();
   if ((endtime-starttime) > OUTTIME)
   {
    if ((*m_pMutex)&SHAREMEM_REQUESTREAD)
    {
     (*m_pMutex) &= ~SHAREMEM_REQUESTREAD;
    }
    return FALSE;
   }
  }
  return FALSE;
 };
};
// 测试类
// 用于测试上面的模板
class CShearMem
{
public:
 CShearMem();
 TCHAR m_str[100];
 ~CShearMem(void);
};
---------------------------------------源文件-----------------------------

#include "StdAfx.h"
#include "ShearMem.h"

CShearMem::CShearMem()
{
}

CShearMem::~CShearMem(void)
{
}
------------------------------------main头文件--内有使用方法--------------------

// ShareMemary.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include "ShearMem.h"
#include <string>

int _tmain(int argc, _TCHAR* argv[])
{
  TShareMem<CShearMem> m_it(__T("kek"));
 CShearMem f;
 wcscpy(f.m_str, __T("ddddddddddd"));
 m_it.UpdateMem(f);
 CShearMem i;
 m_it.ReadMem(i);
 wprintf(i.m_str); 
 system("pause");
 return 0;
}

--------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值