我在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