用C++实现进程同步,进程间共享内存
程序员文章站
2022-03-31 10:09:44
用C++实现进程同步,进程间共享内存
// 一,读共享内存源代码
// //ShareMemory_Read.cpp : 定义控制台应用程序的入口点。
**重点内容**...
用C++实现进程同步,进程间共享内存
// 一,读共享内存源代码 // //ShareMemory_Read.cpp : 定义控制台应用程序的入口点。 **重点内容** #include "stdafx.h" #include "cv.h" #include "cxcore.h" #include "highgui.h" #include #include "opencv2/opencv.hpp" #include "opencv2/highgui/highgui.hpp" #include #include "afxwin.h" //=========互斥量========================================== #include "stdafx.h" #include #include #include char name[100] = "BeiJing-LingYun"; //=========互斥量========================================== using namespace cv; using namespace std; #define BUF_SIZE 5038849 int ImgSaveIndex=0; int main() { // 打开共享的文件对象 while (true) { //------------互斥量------------------------------------------------------------------- HANDLE mutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, name); if (mutex == NULL) { // printf("打开失败\n"); } else { int a=0; } //printf("等待......\n"); DWORD res = WaitForSingleObject(mutex, 20000); switch (res) { case WAIT_OBJECT_0: { printf("收到信号......\n"); //-------------图像处理----------------------------------------------------------------- HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,"ShareMemory"); if (hMapFile) { LPVOID lpBase = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0); // 将共享内存数据拷贝出来 //char szBuffer[BUF_SIZE] = {0}; char *szBuffer= new char[BUF_SIZE]; strcpy(szBuffer,(char*)lpBase); ////----------------存储图像--------------------------------------- Mat MImg; MImg=cv::Mat(1944, 2592,CV_8UC1); memcpy(MImg.data,szBuffer,2592*1944); ImgSaveIndex++; char ch_sf[20]; itoa(ImgSaveIndex,ch_sf,10); string strSaveImageTempPath; string strSavePath="D:\\JD_ImageAcq\\"; strSaveImageTempPath=strSavePath+ch_sf; //存储校正图 string strCalibateImg=strSaveImageTempPath+"_校正.bmp"; imwrite(strCalibateImg,MImg); //存储矫正图 //----------------存储图像--------------------------------------- //printf("%s",szBuffer); // 解除文件映射 UnmapViewOfFile(lpBase); // 关闭内存映射文件对象句柄 CloseHandle(hMapFile); } else { // 打开共享内存句柄失败 printf("OpenMapping Error\n"); //Sleep(2000); } } //-------------图像处理----------------------------------------------------------------- break; case WAIT_TIMEOUT: printf("超时没有收到.....\n"); break; case WAIT_ABANDONED: printf("另一个进程意外终止...\n"); break; default : break; } //一旦不再需要,注意一定要用 CloseHandle 关闭互斥体句柄。如对象的所有句柄都已关闭,那么对象也会删除 CloseHandle(mutex); //------------互斥量------------------------------------------------------------------- } system("pause"); return 0; }
//二,创建共享内存源代码:
//---------------共享内存------------------------------------------------------------------------ // 定义共享数据 cvtColor(MCorrectedImg, MCorrectedImg, COLOR_BGR2GRAY); //转换成灰度图 int channels = MCorrectedImg.channels(); int nRows = MCorrectedImg.rows; //行 int nCols = MCorrectedImg.cols* channels; //列 pDlg->m_pShareDate = new char[nRows * nCols * channels]; bool bb=pDlg->MatToChar(MCorrectedImg,pDlg->m_pShareDate); LPVOID lpBase; HANDLE hMapFile; if (bb==true) { // 创建共享文件句柄 hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 物理文件句柄 NULL, // 默认安全级别 PAGE_READWRITE, // 可读可写 0, // 高位文件大小 BUF_SIZE, // 地位文件大小 "ShareMemory" // 共享内存名称 ); // 映射缓存区视图 , 得到指向共享内存的指针 lpBase = MapViewOfFile( hMapFile, // 共享内存的句柄 FILE_MAP_ALL_ACCESS, // 可读写许可 0, 0, BUF_SIZE ); // 将数据拷贝到共享内存 strcpy((char*)lpBase,pDlg->m_pShareDate); // 线程挂起等其他线程读取数据 Sleep(200); delete [] pDlg->m_pShareDate;//清空共享内存 pDlg->m_pShareDate=NULL; // } else { AfxMessageBox(_T("MatToChar格式转换失败")); } //--------释放互斥量--------------------------- pDlg->MyReleaseMutex(); //======共享内存================================= // 解除文件映射 UnmapViewOfFile(lpBase); // 关闭内存映射文件对象句柄 CloseHandle(hMapFile); //---------------共享内存------------------------------------------------------------------------
//释放互斥量 函数 bool CCameraTimeDlg::MyReleaseMutex() { //互斥量在内核创建。 // 参数:1、指向安全属性的指针, //2、 初始化互斥对象的所有者,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有 //3、 指向互斥对象名的指针 //一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。 HANDLE mutex = CreateMutex(NULL, TRUE, name); if (mutex) { Sleep(10); //printf("创建成功!\n"); char ch = getch(); ReleaseMutex(mutex); //离开互斥区 CloseHandle(mutex); //关闭资源 } else { return false; } return true; }
上一篇: C++ - 工程中头文件的定义
下一篇: docker的几种网络模式