クリティカル セクション オブジェクトを使った 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 );