• 两个进程通过共享内存同步,控制播放器关闭


    共享内存一致可像普通内存那样访问,读写,第一次同步失败,是因为析构函数走不到,进程已关闭。

    1、返修工具端

          HANDLE  hShareMapFile = NULL;
          char* pShareBuf = NULL;
          /*共享内存通讯*/
          int initShareMem(){
              hShareMapFile = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUFFER_SIZE, MAP_FILENAME);  //INVALID_HANDLE_VALUE表示创建一个进程间共享的对象
              if (NULL == hShareMapFile)
              {
                  _tprintf(TEXT("Could not create file mapping object (%d).\n"), GetLastError());
                  return -1;
              }
    
              //2. 将文件数据映射到进程的地址空间
              pShareBuf = (char*)MapViewOfFile(hShareMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFFER_SIZE);
              if (NULL == pShareBuf)
              {
                  _tprintf(TEXT("Could not map view of file (%d). \n"), GetLastError());
    
                  CloseHandle(hShareMapFile);
                  hShareMapFile = NULL;
    
                  return -1;
              }
    
              //3. 写入到内存中
              char *str = "start";
              memcpy(pShareBuf, str, strlen(str)+1);
    
              return 0;
          }
    
          void writeStr(char* str){
              memcpy(pShareBuf, str, strlen(str) + 1);
          }
    
    
          void releaseShareMem(){
              char *str = "myend";
              memcpy(pShareBuf, str, strlen(str) + 1); 
    
              if (pShareBuf!=NULL)  UnmapViewOfFile(pShareBuf);
              if (hShareMapFile != NULL)  CloseHandle(hShareMapFile);
              pShareBuf = NULL;
              hShareMapFile = NULL;
          }

    2、播放器端,通过轮询 ifMainProsClose来判断dui是否已关闭。

         HANDLE  hShareMapFile = NULL;
         char* pShareBuf = NULL;
    public:
         int initShareMem() {
             hShareMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, MAP_FILENAME);
             if (NULL == hShareMapFile){
                 printf(("Could not open file mapping object (%d).\n"), GetLastError());
                 return -1;
             }
    
             //2. 将文件映射内核对象hFileMapping映射到当前应用程序的进程地址pBuf,通过该指针可以读写共享的内存区域
             pShareBuf = (char*)MapViewOfFile(hShareMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFFER_SIZE);
             if (NULL == pShareBuf){
                 printf(("Could not map view of file (%d). \n"), GetLastError());
    
                 CloseHandle(hShareMapFile);
                 hShareMapFile = NULL;
    
                 return -1;
             }
         }
    
         bool ifMainProsClose() {
             if (strcmp(pShareBuf, "myend") == 0)
                 return true;
             else
                 return false;
         }
  • 相关阅读:
    react-native ios打包和Android打包
    用create-react-app创建的react项目怎么解决打包体积过大
    react native 新建项目运行报错
    微信分享等配置,微信授权失败讲解
    微信公众号的code,微信授权
    linux 递归删除指定文件
    mariaDB安装 无密码就可以登录、远程访问、及新版本初始化密码
    mysql 可重复插入、创建语句
    redis数据库入门
    Extjs 3.4 同值合并
  • 原文地址:https://www.cnblogs.com/cnchengv/p/15960138.html
Copyright © 2020-2023  润新知