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

版权声明:本文为业余狙击手原创文章,欢迎阅读,欢迎转载,转载请注明出处,谢谢。 https://blog.csdn.net/sxlsxl119/article/details/78246389

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




欢迎扫码关注我的微信公众号

在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页