C++ 进程间共享内存-实现进程同步
2017-10-16 09:29
471 查看
参考原文:http://blog.csdn.net/liuguangsh/article/details/52130177
11月3日改用事件方式实现进程间同步!
// 一,读共享内存源代码
//二,创建共享内存源代码:
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; }
相关文章推荐
- linux多线程【8】mmap实现父子进程的共享内存通信,用信号量同步
- 共享内存多进程间通信,进程间同步使用信号量来实现
- 进程间共享内存(信号量实现同步)
- 进程间共享内存(信号量实现同步)
- 共享内存多进程间通信,进程间同步使用信号量来实现
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- 利用共享内存和信号灯集实现进程间同步一例
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- php-通过共享内存实现消息队列和进程通信
- linux_c语言实现父子进程共享内存
- 共享内存实现进程间大数据的交换
- linux下通过共享内存在进程之间实现通信(system V)
- [转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- VC共享内存实现进程间数据的交换
- Windows共享内存 C++及C#实现
- 利用共享内存实现进程之间的通讯
- 共享内存实现进程间数据的交换
- VC中进程间共享内存实现
- [转] linux下使用mmap实现进程间共享内存
- Linux 基于IPC机制实现进程间的共享内存处理