您的位置:首页 > 编程语言 > C语言/C++

C++共享内存模板

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

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

/***********************************************************************

* 共享内存类 

* 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;

}

--------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: