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

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

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 @ 2022-03-03 15:36  cnchengv  阅读(66)  评论(0编辑  收藏  举报