2012-10-15 75 views
0

我在Windows上的两个进程之间共享内存通信成功。我这样写: enter image description here同步共享内存

别介意我对自己的评论。我认为我会对图表有些乐趣。 如何更快地做到这一点?换句话说,我如何使用Mutex或CreateEvent来做到这一点?我努力去理解Mutexes和CreateEvent,但它在MSDN上让我感到困惑,因为它在应用程序和线程上使用。一个例子会很有帮助,但不是必需的。

我目前做的方式做到这一点是(很慢!):

//创建共享内存使用文件名+ KnownProcessID这样我就可以有多个客户端和服务器具有独特的映射。我已经有了这种工作和沟通的成功。

bool SharedMemoryBusy() 
{ 
    double* Data = static_cast<double*>(pData); //Pointer to the mapped memory. 
    return static_cast<int>(Data[1]) > 0 ? true : false; 
} 

void* RequestSharedMemory() 
{ 
    for (int Success = 0; Success < 50; ++Success) 
    { 
     if (SharedMemoryBusy()) 
      Sleep(10); 
     else 
      break; 
    } 
    return pData; 
} 

bool SharedMemoryReturned() 
{ 
    double* Data = static_cast<double*>(pData); 
    return static_cast<int>(Data[1]) == 2 ? true : false; 
} 

bool SharedDataFetched() 
{ 
    for (int Success = 0; Success < 50; ++Success) 
    { 
     if (SharedMemoryReturned()) 
      return true; 

     if (!SharedMemoryBusy()) 
      return false; 

     Sleep(10); 
    } 
    return false; 
} 

的阅读和写作部分(的要求只是一个例子。有可能是许多不同的类型..模型,点,位置等):

void* GLHGetModels() 
{ 
    double* Data = static_cast<double*>(RequestSharedMemory()); 
    Data[0] = MODELS; 
    Data[1] = StatusSent; 

    if (SharedDataFetched()) 
    { 
     if (static_cast<int>(Data[2]) != 0) 
     { 
      unsigned char* SerializedData = reinterpret_cast<unsigned char*>(&Data[3]); 
      MemDeSerialize(ListOfModels, SerializedData, static_cast<int>(Data[2])); 
      return Models.data(); 
     } 
     return NULL; 
    } 
    return NULL; 
} 

void WriteModels() 
{ 
    If (pData[0] == MODELS) 
    { 
     //Write The Request.. 
     Data[1] = StatusReturned; 
     Data[2] = ListOfModels.size(); 
     unsigned char* Destination = reinterpret_cast<unsigned char*>(&Data[3]); 
     MemSerialize(Destination, ListOfModels); //Uses MEMCOPY To copy to Destination. 
    } 
} 

回答

1

您可以使用事件和进程之间的互斥体。这工作正常。你只需将它传递给其他程序之前复制对象的句柄:

BOOL WINAPI DuplicateHandle(
    _In_ HANDLE hSourceProcessHandle, 
    _In_ HANDLE hSourceHandle, 
    _In_ HANDLE hTargetProcessHandle, 
    _Out_ LPHANDLE lpTargetHandle, 
    _In_ DWORD dwDesiredAccess, 
    _In_ BOOL bInheritHandle, 
    _In_ DWORD dwOptions 
); 

每个进程都有自己的手柄工作,同时它们都指向同一个内核对象。

你需要做的是创建2个事件。第一方将表示数据已准备就绪。另一侧应该取数据,放置自己的数据,重置第一个事件并发出第二个数据。之后,第一方也这样做。

事件功能是:CreateEvent,SetEvent,... CloseHandle

+0

是的,但这需要我抓住两个进程的句柄,我不能这样做,因为我不知道客户端的ProcessID。只有服务器的。 客户端根据服务器的进程ID打开sharedmemory。 – Brandon

+0

然后打开后,共享客户端应该在那里放置其进程ID或其他识别信息。服务器如何发现客户端想要连接? –

+0

服务器创建共享内存文件。当按下按钮时,客户端连接到该共享内存文件。就是这样。客户端从那里写入请求,然后服务器检查文件是否经常写入,然后进行响应。 我可以这样做吗:“OpenEvent(...,”EventName“);”抢夺另一个进程的事件? – Brandon