2012-10-15 120 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