参考原文: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;
}