0

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.
    }
}
4

1 に答える 1

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つのイベントを作成することです。ファーストパーティは、データの準備ができたことを通知します。反対側は、データを取得し、独自のデータを配置し、最初のイベントをリセットし、2番目のイベントに信号を送る必要があります。その後、最初のパーティも同じことをします。

イベント関数は次のとおりです: CreateEvent、、SetEvent...。CloseHandle

于 2012-10-15T02:21:04.833 に答える