我在Windows上的两个进程之间共享内存通信成功。我这样写:
不要介意我对自己的评论。我以为我对图表有一些乐趣。 我怎么能更快地做到这一点?换句话说,我如何使用Mutex或CreateEvent执行此操作?我努力去理解Mutexes和CreateEvent,但它在MSDN上让我感到困惑,因为它在应用程序和线程上使用它。一个例子会有所帮助,但并不是必需的。
我现在做的方式是(非常慢!):
//使用Filename + KnownProcessID创建SharedMemory,这样我就可以拥有多个具有唯一映射的客户端和服务器。我已经有了这项工作和沟通的成功。
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.
}
}
答案 0 :(得分: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
。