源碼地址:https://download.csdn.net/download/qq_35241071/12087301
一、qt實現
1、寫入
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pSharedMemory = new QSharedMemory("mcq123");
}
MainWindow::~MainWindow()
{
delete ui;
}
//寫入
void MainWindow::on_pushButton_clicked()
{
if(m_pSharedMemory->isAttached())
{
if(!m_pSharedMemory->detach())
{
ui->textBrowser->append("SharedMemory detach failed!");
return;
}
}
//結構體 轉 QByteArray
QByteArray array;
Camera_Control_Stru stru;
stru.cmdId = Command_Set_Zoom;
stru.cameraPos = Camera_Top;
stru.zoomValue = 12;
array.append((char *)&stru, sizeof(stru));
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out<<array;
if(!m_pSharedMemory->create( int(buffer.size()) ) )
{
ui->textBrowser->append("SharedMemory created failed!");
return;
}
m_pSharedMemory->lock();
char *to=(char*)m_pSharedMemory->data();
const char *from=buffer.data().data();
memcpy(to, from, qMin(m_pSharedMemory->size(), (int)buffer.size()));
m_pSharedMemory->unlock();
}
2、讀出
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pSharedMemory = new QSharedMemory("mcq123");
}
MainWindow::~MainWindow()
{
delete ui;
}
//讀出
void MainWindow::on_pushButton_clicked()
{
if(!m_pSharedMemory->attach())
{
ui->textBrowser->append("SharedMemory attach failed!");
return;
}
QBuffer buffer;
QDataStream in(&buffer);
QByteArray array;
m_pSharedMemory->lock();
buffer.setData((char *)m_pSharedMemory->constData(), m_pSharedMemory->size());
buffer.open(QBuffer::ReadOnly);
in>>array;
m_pSharedMemory->unlock();
m_pSharedMemory->detach();
//QByteArray 轉 結構體
Camera_Control_Stru *pStru = (Camera_Control_Stru *)array.data();
ui->textBrowser->append(QString::number(pStru->cmdId));
ui->textBrowser->append(QString::number(pStru->cameraPos));
ui->textBrowser->append(QString::number(pStru->zoomValue));
}
二、純c++實現
#ifndef CSHAREDMEMORY_H
#define CSHAREDMEMORY_H
#include <iostream>
#include <Windows.h>
#define INPUT_SIZE 100 //內存空間的大小
#define MAP_NAME L"Global\\SampleMap"
//指令id
enum CMD_ENUM{
Command_Invalid, //無效指令
Command_Set_Zoom, //設置放大倍數
Command_Update_Zoom //更新放大倍數
};
//相機位置
enum CAMERA_POS_ENUM{
Camera_Top,
Camera_Side
};
//數據結構
struct Camera_Control_Stru{
int cmdId; //指令id
int cameraPos; //相機位置
int zoomValue; //放大倍數
Camera_Control_Stru()
{
memset(this, 0, sizeof (Camera_Control_Stru));
}
};
class CSharedMemory
{
public:
CSharedMemory();
~CSharedMemory();
bool write_SharedMemory(Camera_Control_Stru *pStru);
bool read_SharedMemory(Camera_Control_Stru &stru);
private:
//共享內存句柄
HANDLE m_FileMap_Handle;
LPVOID m_pShareMemory;
HANDLE m_hMutex;
};
#endif // CSHAREDMEMORY_H
#include "CSharedMemory.h"
CSharedMemory::CSharedMemory()
{
//創建鎖,跨進程使用
m_hMutex = CreateMutex(nullptr, NULL, L"Mutex_Camera");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
m_hMutex = OpenMutex(MUTEX_ALL_ACCESS, NULL, L"Mutex_Camera");
}
///1.創建共享內存句柄
SetLastError(NO_ERROR);
m_FileMap_Handle = CreateFileMapping(INVALID_HANDLE_VALUE,
nullptr,
PAGE_EXECUTE_READWRITE,
0,
INPUT_SIZE,
MAP_NAME);
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
//打開共享的文件對象
m_FileMap_Handle = OpenFileMappingW(FILE_MAP_ALL_ACCESS,
NULL,
MAP_NAME);
}
///2.得到共享內存的指針
m_pShareMemory = MapViewOfFile(m_FileMap_Handle,
FILE_MAP_ALL_ACCESS,
0,
0,
INPUT_SIZE);
}
CSharedMemory::~CSharedMemory()
{
///4.解除映射
if(m_pShareMemory)
{
UnmapViewOfFile(m_pShareMemory);
}
///5.關閉句柄
if(m_FileMap_Handle)
{
CloseHandle(m_FileMap_Handle);
m_FileMap_Handle = nullptr;
}
}
/*************************************************
<函數名稱> write_SharedMemory
<功 能> 寫共享內存
<參數說明> key:共享內存標識
pStru:需要寫入的結構體指針
<返 回 值> 是否寫入成功
<函數說明> 無
**************************************************/
bool CSharedMemory::write_SharedMemory(Camera_Control_Stru *pStru)
{
if(nullptr == m_pShareMemory)
{
return false;
}
WaitForSingleObject(m_hMutex, INFINITE);
Camera_Control_Stru *pStruTemp = (Camera_Control_Stru *)m_pShareMemory;
pStruTemp->cmdId = pStru->cmdId;
pStruTemp->cameraPos = pStru->cameraPos;
pStruTemp->zoomValue = pStru->zoomValue;
ReleaseMutex(m_hMutex);
return true;
}
/*************************************************
<函數名稱> read_SharedMemory
<功 能> 讀共享內存
<參數說明> key:共享內存標識
stru:讀到的數據結構體
<返 回 值> 是否讀取成功
<函數說明> 無
**************************************************/
bool CSharedMemory::read_SharedMemory(Camera_Control_Stru &stru)
{
if(nullptr == m_pShareMemory)
{
return false;
}
WaitForSingleObject(m_hMutex, INFINITE);
stru = *((Camera_Control_Stru *)m_pShareMemory);
ReleaseMutex(m_hMutex);
return true;
}