Windows上の2つのプロセス間でメモリ通信を正常に共有しました。私は次のように書きます:
私のコメントを気にしないでください。ダイアグラムを楽しんでみようと思いました。どうすればこれをより速く行うことができますか?つまり、MutexまたはCreateEventを使用してこれを行うにはどうすればよいですか?MutexesとCreateEventを理解しようと懸命に努力しましたが、MSDNではアプリケーションとスレッドで使用するため混乱します。例は役に立ちますが、必須ではありません。
私が現在行っている方法は(非常に遅いです!):
//ファイル名+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.
}
}