Microsoft DirectX 8.0 (C++) |
Microsoft® DirectPlay® のネットワーキングおよび音声コールバックは、マルチスレッド化されている。したがって、DirectPlay のコールバックで正しく信頼性の高いデータ アクセスを行うには、同期をマルチスレッド化する手段を実装しなければならない。
現時点では、マルチスレッド コールバックのデータの同期をとるために、3 つの手段がある。
クリティカル セクション オブジェクトを使って同期をとる方法は、DirectX 8.0 SDK に付属する DirectPlay の音声関連サンプルに示されている。クリティカル セクション オブジェクトの使い方については、以下のトピックも参考になる。ミューテックス オブジェクトまたはセマフォ オブジェクトを実装する場合、これらのトピックは、SDK (Microsoft Platform Software Development Kit) にも、多くのリファレンス ブックにも記載されているので、参照すること。これらの同期手段は、万一何らかの問題が起きた場合、複雑で難しいデバッグ作業が必要になる。このため、いずれかを実装するには、個々の分野に関する相当進んだ知識がなければならない。
CRITICAL_SECTION g_csPlayerContext; InitializeCriticalSection(&g_csPlayerContext);
次に、DirectPlay メッセージ コールバック ハンドラを実装する。
HRESULT WINAPI DirectPlayMessageHandler( PVOID pvUserContext, DWORD dwMessageId, PVOID pMsgBuffer ) { switch( dwMessageId ) { case DPN_MSGID_CREATE_PLAYER: { EnterCriticalSection( &g_csPlayerContext ); //コールバックがロックされた。 //プレーヤー データの処理をする。 LeaveCriticalSection( &g_csPlayerContext ); } } }
最後に、アプリケーションの終了時に、DeleteCriticalSection 関数を呼び出して、クリティカル セクション オブジェクトに関連付けられたメモリを解放する必要がある。
DeleteCriticalSection( &g_csPlayerContext );