Platform SDK: DirectX |
メッセージを非同期に送信できれば、アプリケーションの通信コードが各メッセージを転送する間に制御を独占するのを避けることができる。これにより、送出するメッセージを管理するための負担を DirectPlay に転嫁し、なおかつアプリケーションでメッセージ キューを監視してメッセージをキャンセルすることが可能になる。
非同期メッセージング機能は、セッションで DirectPlay プロトコルを使用しているか、またはサービス プロバイダによってこの機能がサポートされている場合にのみ利用できる。たとえば、TCP/IP サービス プロバイダは、コンピュータが Windows Sockets 2.0 以降を使用している場合のみ、非同期メッセージをサポートする。
DirectPlay プロトコルを使用していない場合は、セッションが確立した後に IDirectPlay4::GetCaps メソッドを使用して DPCAPS_ASYNCSUPPORTED フラグを調べ、非同期メッセージがサポートされているかどうかを判断することが重要である。
非同期メッセージを送信するには、IDirectPlay4::SendEx メソッドを使用する。このとき、dwFlags パラメータに DPSEND_ASYNC フラグを設定する。SendEx は、直ちに戻る。後ほど、アプリケーションは送信したメッセージの結果を示す状態を含む DPMSG_SENDCOMPLETE システム メッセージを受信する。この通知が実行されないようにするには、メッセージを送信するときに DPSEND_NOSENDCOMPLETEMSG フラグを設定する。アプリケーションは、SendEx によって返される dwMsgID パラメータを使用して、個々のメッセージを追跡することができる。この ID は、個々のメッセージをキャンセルしたり、完了通知メッセージと比較する際に使用することができる。
SendEx を使用すると、タイムアウト値と優先順位をサポートするセッション内のメッセージに、それらの値を割り当てることができる。また、IDirectPlay4::CancelMessage メソッドまたは IDirectPlay4::CancelPriority メソッドを使用して、送信キュー内のメッセージをキャンセルすることもできる。タイムアウト、優先順位、およびキャンセルの機能には、DirectPlay プロトコルまたはサービス プロバイダによるサポートが必要である。これらは、IDirectPlay4::GetCaps メソッドによって判断される。
DirectPlay プロトコルが使用されていない場合は、セッションが確立した後で DirectPlay4.GetCaps メソッドを使用して DPCAPS_ASYNCSUPPORTED フラグをチェックし、非同期メッセージがサポートされているかどうかを確認することが重要である。
非同期メッセージを送信するには、DirectPlay4.SendEx メソッドを使用する。このとき、flags パラメータに DPSEND_ASYNC フラグを設定する。SendEx は直ちに戻る。後ほど、アプリケーションは送信したメッセージの結果を示す状態を含む DPMSG_SENDCOMPLETE システム メッセージを受信する。この通知が実行されないようにするには、メッセージを送信するときに DPSEND_NOSENDCOMPLETEMSG フラグを設定する。アプリケーションは、SendEx によって返される dwMsgID パラメータを使用して、個々のメッセージを追跡することができる。この ID は、個々のメッセージをキャンセルしたり、完了通知メッセージと比較する際に使用することができる。
SendEx を使用すると、タイムアウト値と優先順位をサポートするセッション内のメッセージに、それらの値を割り当てることができる。また、DirectPlay4.CancelMessage メソッドまたは DirectPlay4.CancelPriority メソッドを使用して、送信キュー内のメッセージをキャンセルすることもできる。タイムアウト、優先順位、およびキャンセルの機能には、DirectPlay プロトコルまたはサービス プロバイダによるサポートが必要である。これらは、DirectPlay4.GetCaps メソッドによって判断される。
非同期メッセージと同期メッセージを組み合わせて使用する場合は、十分な注意が必要である。キュー内の非同期メッセージに続いて同期メッセージが送信されると、その同期メッセージが完了するまで、制御がブロックされる。
タイムアウトと優先順位がサポートされている場合は、これらを同期メッセージで使用できる。IDによるメッセージの追跡とキャンセルは、同期メッセージには適用されない。
非同期メッセージングは、帯域幅を拡大したり、待ち時間を軽減したりするものではない。
非同期メッセージを効果的に使用する方法の詳細については、「DirectPlay プロトコルを使用した非同期ネットワーキング」を参照すること。