可直接拷贝使用)"/>
进程间通信方式之共享内存(带源码,可直接拷贝使用)
目录
3.使用方法
1.MyShareMemory.h
#pragma once
#include <windows.h>class ShareMemoryQtWithMfc;
extern ShareMemoryQtWithMfc g_memoryQtWithMfc;class ShareMemoryQtWithMfc
{
public:ShareMemoryQtWithMfc();~ShareMemoryQtWithMfc();//用信号量控制进程间的数据同步void Lock();void UnLock();//下面这2个函数是使用共享内存的例子void SetUiType(unsigned short type);unsigned short GetUiType();//打开共享内存bool OpenShareMemory();private:HANDLE m_hMapFile;//共享内存句柄BYTE *m_shareMemory;//共享内存指针HANDLE m_hSemaphore;//信号量
};
2.MyShareMemory.cpp
#include "MyShareMemory.h"#define SHAREMEMORY_SIZE 4096 //共享内存大小,这里我定义的是4096个字节ShareMemoryQtWithMfc g_memoryQtWithMfc;ShareMemoryQtWithMfc::ShareMemoryQtWithMfc()
{//创建共享文件句柄 m_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, // 物理文件句柄NULL, // 默认安全级别PAGE_READWRITE, // 可读可写0, // 高位文件大小SHAREMEMORY_SIZE, // 地位文件大小L"QtShareMemory" // 共享内存名称);//映射缓存区视图, 得到指向共享内存的指针m_shareMemory = (BYTE*)MapViewOfFile(m_hMapFile, // 共享内存的句柄FILE_MAP_ALL_ACCESS, // 可读写许可0,0,SHAREMEMORY_SIZE);memset(m_shareMemory, 0, SHAREMEMORY_SIZE);//清空一下共享的内存区的数据m_hSemaphore = CreateSemaphore(NULL, 0, 1, L"QtSemaphore");//创建信号量
}ShareMemoryQtWithMfc::~ShareMemoryQtWithMfc()
{//解除文件映射UnmapViewOfFile(m_shareMemory);//关闭内存映射文件对象句柄CloseHandle(m_hMapFile);
}void ShareMemoryQtWithMfc::Lock()
{WaitForSingleObject(m_hSemaphore, INFINITE);
}void ShareMemoryQtWithMfc::UnLock()
{ReleaseSemaphore(m_hSemaphore, 1, NULL);
}void ShareMemoryQtWithMfc::SetUiType(unsigned short type)
{m_shareMemory[0] = type >> 8;m_shareMemory[1] = type;
}unsigned short ShareMemoryQtWithMfc::GetUiType()
{return (unsigned short)((m_shareMemory[0] << 8) + m_shareMemory[1]);
}bool ShareMemoryQtWithMfc::OpenShareMemory()
{if (NULL == m_hMapFile){m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, L"QtShareMemory");if (m_hMapFile){m_shareMemory = (BYTE*)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);return true;}else{//打开共享内存句柄失败return false;}} return true;
}
3.使用方法
直接把上面的代码拷贝到工程中编译,这里假设有A和B两个工程,则两个工程中都要编译这个类。
第1步:A进程先启动
//创建共享内存
g_memoryQtWithMfc.CreateShareMemory();...
第2步:B进程也启动
//打开共享内存
g_memoryQtWithMfc.OpenShareMemory();...
第3步:A进程修改共享内存的数据
//如果希望修改后的数据一定能被B进程读取,这里可以加锁
g_memoryQtWithMfc.Lock();
g_memoryQtWithMfc.SetUiType();
...
第4步:B进程读取A进程写入共享内存的数据
g_memoryQtWithMfc.GetUiType();//数据读取出来之后要解锁,使得A可以继续修改内存数据
g_memoryQtWithMfc.UnLock();
...
更多推荐
进程间通信方式之共享内存(带源码,可直接拷贝使用)
发布评论