进程间通信方式之共享内存(带源码,可直接拷贝使用)

编程入门 行业动态 更新时间:2024-10-07 18:26:07

进程间通信方式之共享内存(带源码,<a href=https://www.elefans.com/category/jswz/34/1768893.html style=可直接拷贝使用)"/>

进程间通信方式之共享内存(带源码,可直接拷贝使用)

目录

1.MyShareMemory.h

2.MyShareMemory.cpp

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();
...

更多推荐

进程间通信方式之共享内存(带源码,可直接拷贝使用)

本文发布于:2024-03-14 05:46:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1735766.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:可直接   源码   进程   内存   通信

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!