次の方法で共有


クリティカル セクション オブジェクトを使った DirectPlay ネットワーキング コールバックの実装

クリティカル セクション オブジェクトを使った DirectPlay ネットワーキング コールバックの実装

Microsoft® DirectPlay® のネットワーキングおよび音声コールバックは、マルチスレッド化されている。したがって、DirectPlay のコールバックで正しく信頼性の高いデータ アクセスを行うには、同期をマルチスレッド化する手段を実装しなければならない。

現時点では、マルチスレッド コールバックのデータの同期をとるために、3 つの手段がある。

  • ミューテックス オブジェクト
  • セマフォ オブジェクト
  • クリティカル セクション オブジェクト

クリティカル セクション オブジェクトを使って同期を取る方法は、Microsoft DirectX® SDK に付属する DirectPlay の音声関連サンプルに示されている。 クリティカル セクション オブジェクトの使い方については、以下のトピックも参考になる。ミューテックス オブジェクトまたはセマフォ オブジェクトを実装する場合、Microsoft Platform Software Development Kit (SDK) や多くの参考書籍に説明が記載されている。これらの同期手段は、万一何らかの問題が起きた場合、複雑で難しいデバッグ作業が必要になる。このため、いずれかを実装するには、個々の分野に関する相当進んだ知識がなければならない。

CRITICAL_SECTION g_csPlayerContext;
InitializeCriticalSectionAndSpinCount(&g_csPlayerContext, 0);

次に、DirectPlay メッセージ コールバック ハンドラを実装する。

HRESULT WINAPI DirectPlayMessageHandler( PVOID pvUserContext,
                                         DWORD dwMessageId, 
                                         PVOID pMsgBuffer )
{
    switch( dwMessageId )
    {
        case DPN_MSGID_CREATE_PLAYER:
        {
             EnterCriticalSection( &g_csPlayerContext );
             //callback is now locked
             //perform operation on player data
             LeaveCriticalSection( &g_csPlayerContext );
        }
    }
}

最後に、アプリケーションの終了時に、DeleteCriticalSection 関数を呼び出して、クリティカル セクション オブジェクトに関連付けられたメモリを解放する必要がある。

DeleteCriticalSection( &g_csPlayerContext );