一个操作共享内存的容器类!可使用各种数据结构!但是没有写进程间通讯的部分!可方便扩充!
^_^
class CShareMem
{
public:
CShareMem(LPCTSTR lpcszMemName = _T("ShareMemSection"));
CShareMem(int cCount, size_t cSize, LPCTSTR lpcszMemName = _T("ShareMemSection"));
virtual ~CShareMem();
BOOL InitializeMem(int cCount, size_t cSize );
size_t GetDataSize() {return m_cDataSize;};
int GetDataCount() {return m_cDataCount;};
BOOL Clear() ;
BOOL Lock(DWORD dwMilliSeconds = INFINITE);
BOOL Unlock();
LPVOID GetData(int nIndex = 0);
BOOL GetData(int nIndex, LPVOID lpvData, size_t cSize);
BOOL AddData(LPVOID lpvData, size_t cSize);
BOOL SetData(int nIndex, LPVOID lpvData, size_t cSize);
BOOL Delete(int nIndex );
protected:
LPVOID m_lpvData; //数据指针
size_t m_cDataSize; //数据元素大小(BYTE)
int m_cDataCount; //数据元素个数
BOOL m_fInit; //是否初始化成功
HANDLE m_hMutant; //互斥量
HANDLE m_hSharedMemoryFile; //共享内存核心文件句柄
CString m_strMutantName; //互斥量名字
CString m_strShareMemName; //共享内存区域名字
BOOL m_fExist ; //是否已存在
};
#endif // !defined// ShareMem.cpp: implementation of the CShareMem class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ShareMem.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CShareMem::CShareMem(LPCTSTR lpcszMemName)
{
m_cDataCount = 0;
m_cDataSize = 0;
m_fInit = FALSE;
m_fExist = FALSE;
m_lpvData = NULL;
m_hSharedMemoryFile = NULL;
//m_strMutantName = L"ShareMemMutant";
//m_strShareMemName = L"ShareMemSection";
m_strShareMemName = lpcszMemName;
m_strMutantName = lpcszMemName + _T("Mutant");
}
CShareMem::CShareMem(int cCount, size_t cSize, LPCTSTR lpcszMemName)
{
m_cDataCount = cCount;
m_cDataSize = cSize;
m_fInit = FALSE;
m_lpvData = NULL;
m_hSharedMemoryFile = NULL;
m_fExist = FALSE;
//m_strMutantName = L"ShareMemMutant";
//m_strShareMemName = L"ShareMemSection";
m_strShareMemName = lpcszMemName;
m_strMutantName = lpcszMemName + _T("Mutant");
}
CShareMem::~CShareMem()
{
if (m_fInit) //
{
UnmapViewOfFile(m_lpvData);
CloseHandle(m_hSharedMemoryFile);
}
}
//
// 清除所有共享内存区域的数据
//
BOOL CShareMem::Clear()
{
try
{
memset((PBYTE)m_lpvData, 0, m_cDataSize * m_cDataCount);
return TRUE;
}
catch(...)
{
return FALSE;
}
}
//
// 取得nIndex位置上的数据指针
//
LPVOID CShareMem::GetData(int nIndex )
{
if (m_fInit)
{
if (nIndex < 0 || nIndex >= m_cDataCount)
return NULL;
return (PBYTE)m_lpvData + nIndex * m_cDataSize;
}
else
{
return NULL;
}
}
//
// 取得nIndex位置上的数据
//
BOOL CShareMem::GetData(int nIndex,LPVOID lpvData,size_t cSize)
{
if (m_fInit)
{
if (nIndex < 0 || nIndex >= m_cDataCount)
return FALSE;
if (cSize != m_cDataSize )
{
return FALSE;
}
memcpy(lpvData,(PBYTE)m_lpvData + nIndex * m_cDataSize,cSize);
return TRUE;
}
else
{
return FALSE;
}
}
//
// 删除 nIndex位置的数据
//
BOOL CShareMem::Delete(int nIndex)
{
if (m_fInit)
{
if (nIndex < 0 || nIndex >= m_cDataCount)
return FALSE;
int nLeft = m_cDataCount - nIndex - 1;
PBYTE pbBuff = new BYTE[nLeft * m_cDataSize];
//删除头
if (0== nIndex )
{
memcpy(pbBuff,(PBYTE)m_lpvData + m_cDataSize ,(m_cDataCount -1)*m_cDataSize);
memset(m_lpvData,0,m_cDataCount * m_cDataSize);
memcpy(m_lpvData,pbBuff,(m_cDataCount -1)*m_cDataSize);
}
//删除尾
else if ((m_cDataCount -1) == nIndex )
{
memset((PBYTE)m_lpvData + (nIndex *m_cDataSize),0 ,m_cDataSize);
}
else
{
memcpy(pbBuff,(PBYTE)m_lpvData + (nIndex + 1)*m_cDataSize,nLeft * m_cDataSize);
memset((PBYTE)m_lpvData + (nIndex )*m_cDataSize,0,(m_cDataCount - nIndex) * m_cDataSize);
memcpy((PBYTE)m_lpvData + (nIndex )*m_cDataSize,pbBuff,nLeft *m_cDataSize);
}
delete [] pbBuff;
m_cDataCount --;
return TRUE;
}
else
{
return FALSE;
}
}
//
// 添加数据到数据尾
//
BOOL CShareMem::AddData(LPVOID lpvData,size_t cSize)
{
try
{
//
if ((m_cDataSize!= 0 && m_cDataSize != cSize))
{
return FALSE;
}
if (!m_fInit)
{
return FALSE;
}
//
//if (m_cDataCount == 0)
memcpy((PBYTE)m_lpvData + (m_cDataCount )*m_cDataSize, lpvData,cSize);
m_cDataCount ++ ;
return TRUE;
}
catch(CMemoryException *memE)
{
memE->ReportError();
memE->Delete();
return FALSE;
}
catch(...)
{
return FALSE;
}
}
//
// 设置nIndex位置上的数据
//
BOOL CShareMem::SetData(int nIndex,LPVOID lpvData,size_t cSize)
{
if (m_fInit)
{
if (nIndex < 0 || nIndex >= m_cDataCount)
return FALSE;
if (m_cDataSize != cSize)
{
TRACE(_T("数据大小不匹配!!!/n"));
return FALSE;
}
memset((PBYTE)m_lpvData + nIndex * m_cDataSize,0,cSize);
memcpy((PBYTE)m_lpvData + nIndex * m_cDataSize,lpvData,cSize);
return TRUE;
}
else
{
return FALSE;
}
}
//
// 初始化 共享内存和各个变量
//
BOOL CShareMem::InitializeMem(int cCount,size_t cSize)
{
m_hMutant = CreateMutex(NULL,FALSE,m_strMutantName);
m_cDataSize = cSize;
m_cDataCount = cCount;
//创建一内存映射文件,设定共享内存区域
m_hSharedMemoryFile = ::CreateFileMapping(
(HANDLE)0xFFFFFFFF, // 文件句柄
NULL, // 安全属性(WIN95忽略)
PAGE_READWRITE, // 文件的保护属性
0, // 使用页面文件
1<<16, // 共享内存大小
m_strShareMemName.GetBuffer(0));// 共享内存名称
m_strShareMemName.ReleaseBuffer();
if(m_hSharedMemoryFile == NULL)
{
m_fExist = FALSE;
m_fInit = FALSE;
return FALSE;
}
else
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
m_fExist = TRUE;
}
m_lpvData = ::MapViewOfFile(
m_hSharedMemoryFile, // 核心对象的文件HANDLE
FILE_MAP_ALL_ACCESS, // Read/Write
0, // 使用页面文件
0, // 映射整个共享内存区域
0); // 映射整个空间
if(m_lpvData == NULL)
{
m_fInit = FALSE;
CloseHandle(m_hSharedMemoryFile);
return FALSE;
}
else
m_fInit = TRUE;
return TRUE;
}
//
// 互斥锁定共享内存
//
BOOL CShareMem::Lock(DWORD dwMilliSeconds )
{
if( WaitForSingleObject(m_hMutant,dwMilliSeconds) == WAIT_OBJECT_0)
return TRUE;
return FALSE;
}
//
// 互斥解锁共享内存
//
BOOL CShareMem::Unlock()
{
return ReleaseMutex(m_hMutant);
}
分享到:
相关推荐
在这个例子中,我们定义了一个名为`Student`的结构体,包含五个成员:一个整型变量`id`,一个长度为20的字符数组`name`,一个字符变量`gender`,一个整型变量`age`,以及一个浮点型变量`score`。 结构体变量: 定义...
结构体是一种复合数据类型,它可以包含不同类型的多个成员,这些成员通常用于表示一个复杂对象的不同属性或特征。通过结构体,开发者能够更高效地组织和操作数据。 ##### 2.1 结构体定义 定义结构体的基本语法如下...
在共享链表的实现中,我们需要使用结构体来定义节点的结构体,其中包括指针域和数据域。指针域用于指向下一个节点,而数据域用于存储节点的数据。在实现共享链表时,我们需要使用 malloc 函数来动态分配内存,以便...
- **栈管理器**:一个类或结构体,负责创建和管理这些栈,包括分配和释放内存、调整栈的大小等。 5. **核心操作** - **push()**:将元素添加到栈顶。需要考虑当前栈是否已满,若满则扩展堆栈数组。 - **pop()**...
实验通过编写一个包含多个进程的程序,实现数据的读取、处理和输出功能。具体而言,实验的目标有两个方面: 1. **掌握进程间通讯的编程方法**:这包括理解并实现不同类型的进程间通信机制,如信号、共享存储区、...
处理链表时,可以使用结构体指针来添加、删除和遍历节点。 9.5 共用体类型: 共用体(union)是一种特殊的数据类型,它允许多个数据成员共享同一块内存空间。这意味着任何时刻只有一个成员有值。定义共用体的语法...
在C语言中,结构体是一种复合数据类型,它允许在一个单一的数据类型下组织不同类型的数据。在这个示例中,定义了三种结构体:`view_info`、`way_info` 和 `path_info`。 - **`view_info` 结构体**:包含景点信息。 ...
图书信息通常包含书名、作者、出版社、出版日期等多个属性,通过结构体可以将这些信息打包成一个整体,方便管理和操作。 5. **函数**:函数是C语言组织代码的主要方式,每个功能如登录、注册、查询等都被封装为独立...
1. **Pagecache 和 Swapcache**:每个物理页面都有一个`struct page`结构体来描述,其中包含了一个指向`struct address_space`的指针。内核通过`struct address_space`结构和偏移量来区分不同的页面。 2. **文件与`...
数据结构课程设计是计算机科学教育中的一个重要环节,它让学生深入理解如何有效地组织和操作数据,以便在实际问题中实现高效算法。在这个特定的项目中,我们关注的是一个宿舍管理软件,它采用C语言进行实现,提供了...
C++可以使用结构体或类来表示链表节点,通过指针操作实现添加、删除和遍历。 栈(Last In, First Out - LIFO)和队列(First In, First Out - FIFO)是两种常用的操作数据集合的方式。C++标准库提供`std::stack`和`...
在C++中,这种数据结构可能被实现为一个结构体数组、链表、树或者其他复杂的数据结构,用于高效地存储和检索联系人数据。同时,考虑到文件操作,项目中应该包含读取和写入这些数据的I/O函数,可能使用了标准库中的...
2. **数据结构定义**:顺序表通常通过结构体来实现,结构体包含一个指向数组的指针以及数组的长度。例如: ```c typedef struct { int* elements; int length; int capacity; } SequenceList; ``` 3. **初始...
为了保护共享内存中的数据,我们需要使用信号量机制,这是一个原子操作的计数器,可以用来同步对共享资源的访问。 1. **共享内存**:在Linux中,可以使用`shmget()`函数创建共享内存段,然后通过`shmat()`将该内存...
例如,你可以创建一个`LinkedListNode`结构体来表示链表节点,包含一个值字段和一个指向下一个节点的引用。 3. **枚举(Enums)**:Rust的枚举不仅仅是一个简单的类型定义,它还可以包含关联值,这使得枚举在实现...
结构体内部可以包含各种基本数据类型的成员,如`int`、`char`、指针等。在结构体定义后,可以声明结构体变量,如`struct T a[]`创建了一个结构体数组。 2. **结构体指针**: 结构体指针可以用来访问结构体的成员,...
这构成了一个链表,使得可以在内存中动态地添加和删除元素。 2. **动态内存分配**:`new`关键字用于动态地创建和初始化链表中的元素。当用户输入一个字符时,一个新的`ca`结构被创建并链接到链表的末尾。`new`操作...
2. **构建消息**:发送方准备要发送的数据,封装到`struct msgbuf`结构体中,该结构体通常包含一个类型字段和一个数据字段。 3. **发送消息**:使用`msgsnd()`函数将消息发送到消息队列,指定队列ID、消息结构体指针...
在学生管理系统中,我们可以定义一个`Student`结构体,包含学号(int类型)、姓名(char类型的字符串)、年龄(int类型)等字段,方便对单个学生的信息进行操作。 3. **动态内存分配**:由于学生数量可能不确定,...
它是一个特殊的类型,包含一系列成员,这些成员可以是各种类型的数据。共同体的一个重要特性是它的内存布局非常紧凑,所有成员共享同一块内存空间,这意味着修改一个成员可能会影响其他成员的值。在处理资源有限或者...