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

C++ 进程间共享内存-实现进程同步

2017-10-16 09:29 471 查看
参考原文:http://blog.csdn.net/liuguangsh/article/details/52130177

11月3日改用事件方式实现进程间同步!

// 一,读共享内存源代码

// //ShareMemory_Read.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <stdlib.h>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include "afxwin.h"
//==========================================
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
char name[100] = "BeiJing-LingYun";

HANDLE hNewImageEvent;
HANDLE hDoneEvent;
LPVOID lpBase;
HANDLE hMapFile;
//==========================================

using namespace cv;
using namespace std;

#define BUF_SIZE 5038848   //2592*1944
//#define BUF_SIZE 4096   //2592*1944

#define Img_Width  2592
#define Img_Height 1944

int ImgSaveIndex=0;

int main()
{

hNewImageEvent=0;
hDoneEvent=0;

// 打开共享的文件对象
char *szBuffer= new char[BUF_SIZE];

hDoneEvent = CreateEvent(NULL, false, false, "JD_DoneEvent");  //创建事件
while (!hNewImageEvent)
{
hNewImageEvent = OpenEvent(STANDARD_RIGHTS_ALL, false, "JD_NewImageEvent");
}
while (true)
{
WaitForSingleObject(hNewImageEvent, INFINITE);

//-------------图像处理-----------------------------------------------------------------
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,"ShareMemory");
if (hMapFile!=0)
{
lpBase = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);

// 将共享内存数据拷贝出来
strcpy(szBuffer,(char*)lpBase);

////----------------存储图像---------------------------------------
//cout<<szBuffer<<endl;
Mat MImg;
MImg=cv::Mat(Img_Height, Img_Width,CV_8UC1);
memcpy(MImg.data,szBuffer,Img_Width*Img_Height);

ImgSaveIndex++;
char ch_sf[20];
itoa(ImgSaveIndex,ch_sf,10);
string strSaveImageTempPath;
string strSavePath="C:\\LingYun_2017\\SavedImages\\";
strSaveImageTempPath=strSavePath+ch_sf;

//存储校正图
string strCalibateImg=strSaveImageTempPath+"_Corrected.bmp";

imwrite(strCalibateImg,MImg);              //存储矫正图
//----------------存储图像---------------------------------------

// 解除文件映射
UnmapViewOfFile(lpBase);
// 关闭内存映射文件对象句柄
CloseHandle(hMapFile);
SetEvent(hDoneEvent);  //设置事件

}
}

CloseHandle(hNewImageEvent);
//删除动态分配的内存
delete [] szBuffer;
szBuffer=NULL;

system("pause");
return 0;
}


//二,创建共享内存源代码:

//// ShareMemory_Create.cpp : 定义控制台应用程序的入口点。
////
//
#include "stdafx.h"
//--------互斥量---------------------------------------------------
#include<stdio.h>
#include <conio.h> //getch();  头文件
#include<Windows.h>
//--------互斥量---------------------------------------------------

#include <windows.h>
#include "iostream"
using namespace std;

#define BUF_SIZE 4096

char name[100] = "BeiJing-LingYun";
LPVOID lpBase;
HANDLE hMapFile;
HANDLE hNewImageEvent;
HANDLE hDoneEvent;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
//-----------------------------------------------------------------------------
int index=0;
char szBuffer[20];
//-----------共享内存-----------------------------------
hMapFile=0;
hNewImageEvent=0;
hDoneEvent=0;
// 创建共享文件句柄
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,   // 物理文件句柄
NULL,                   // 默认安全级别
PAGE_READWRITE,         // 可读可写
0,                      // 高位文件大小
BUF_SIZE,               // 地位文件大小
"ShareMemory"           // 共享内存名称
);

// 映射缓存区视图 , 得到指向共享内存的指针
lpBase = MapViewOfFile(
hMapFile,                // 共享内存的句柄
FILE_MAP_ALL_ACCESS,     // 可读写许可
0,
0,
BUF_SIZE
);

hNewImageEvent = CreateEvent(NULL, false, false, "JD_NewImageEvent");

while (!hDoneEvent)
{
hDoneEvent = OpenEvent(STANDARD_RIGHTS_ALL, false, "JD_DoneEvent");
}
//-----------共享内存-----------------------------------
//-----------------------------------------------------------------------------
while (true)
{
// 线程挂起等其他线程读取数据
Sleep(1000);

// 定义共享数据
index++;

cout<<index<<endl;
itoa(index,szBuffer,10);

// 将数据拷贝到共享内存
strcpy((char*)lpBase,szBuffer);

SetEvent(hNewImageEvent);
WaitForSingleObject(hDoneEvent, INFINITE);
//清空共享内存数据
int a=0;
}
CloseHandle(hDoneEvent);
// 解除文件映射
UnmapViewOfFile(lpBase);
// 关闭内存映射文件对象句柄
CloseHandle(hMapFile);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存