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

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

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;
     }
复制代码

 

posted @   cnchengv  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示