Microsoft DirectX 8.0 (C++)

DirectPlay コールバック関数とマルチスレッドに関する問題

Microsoft® DirectPlay® と DirectPlay Voice では、DirectPlay が発行するイベントを処理するため、いくつかのコールバック関数を独自に実装する必要がある。DirectPlay はマルチスレッド化されているので、同時に複数のイベントを発行することがある。このため、重複する複数のコールバックがアプリケーションに届く可能性がある。

DirectPlay には、コールバックの指示に対応するために、スレッド プールが保持されている。コールバックは、DirectPlay が保持するプール内のスレッドから起動される。Microsoft Windows 2000 では、このスレッド プールのサイズをプロセスごとに構成できる。また、DirectPlay では、Windows 2000 上で動作するときに I/O 完了ポートを使用する。I/O 完了ポートは高度な問題であり、ここでは説明しない。この件については、MSDN (Microsoft Developer Network ) のドキュメントや、Win32 のマルチスレッドに関する現在入手可能なリファレンスを参照することを推奨する。

したがって、DirectPlay コールバックで正しく信頼性の高いデータ アクセスを行うには、同期をマルチスレッド化する手段を実装しなければならない。このことを、コールバックを "再入可能" または "スレッドセーフ" にする、と言う。

Microsoft Windows OS ファミリでは、現在、マルチスレッド環境でデータの同期をとるために、以下の 3 つの方法が用意されている。

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

DirectPlay のスレッド モデルは、最高の効率が得られるように最適化されている。このため、"送信" 処理中、および受信メッセージを含む "指示" メッセージ中に、スレッド コンテキストが切り替わることはない。

ここでは、「DirectPlay のネットワーキング コールバック」について説明する。

詳細については、「DirectPlay と DirectPlay Voice におけるコールバック関数の実装」を参照すること。