我在Windows上的兩個進程之間共享內存通信成功。我這樣寫: 同步共享內存
別介意我對自己的評論。我認爲我會對圖表有些樂趣。 如何更快地做到這一點?換句話說,我如何使用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.
}
}
是的,但這需要我抓住兩個進程的句柄,我不能這樣做,因爲我不知道客戶端的ProcessID。只有服務器的。 客戶端根據服務器的進程ID打開sharedmemory。 – Brandon
然後打開後,共享客戶端應該在那裏放置其進程ID或其他識別信息。服務器如何發現客戶端想要連接? –
服務器創建共享內存文件。當按下按鈕時,客戶端連接到該共享內存文件。就是這樣。客戶端從那裏寫入請求,然後服務器檢查文件是否經常寫入,然後進行響應。 我可以這樣做嗎:「OpenEvent(...,」EventName「);」搶奪另一個進程的事件? – Brandon