频道栏目
首页 > 资讯 > C++ > 正文

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

17-10-17        来源:[db:作者]  
收藏   我要投稿

用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;
}
相关TAG标签
上一篇:电脑能上qq等软件但是浏览器打不开网页处理方法
下一篇:Android开发中如何设置对话框实现全屏
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站