メッセージループ/プロシージャでWSAPIのSENSEモードのみを使用してプログラミングすることも可能です。
ただし、SENSE指定の場合には必ずしも処理が成功するとは限りません。その時には、次のような方法でプログラミングする必要があります。SENSEモードのみを使用するプログラミングはWAITモードを使用する場合に比べシステムに負荷をかけることになりますので注意してください。
何かキーが押されたときDUET会話処理をする場合を例に挙げて説明します。
まず、メッセージループは以下のようにします。
/* メッセージループ */ while (TRUE){ ret = PeekMessage(&msg); (2) if ( ret == メッセージ あり) { (3) TranslateMessage(&msg); DispatchMessage(&msg); } else { /* メッセージ なし */ if ( /* 受信要求あり */ resp_flag == ON ) { ret = XWSI_DC_READ( sense_mode ); (4) if ( ret == データ あり ) { SendMessage( RCV_CMP ); (5) resp_flag = OFF; } } ↓(続く)
また、メッセージ処理は以下のようにします。
/* メッセージ処理 */ switch (message) { case WM_COMMAND: 処理 break; case WM_COMMAND: 処理 break; case WM_CHAR: (1) /* 何かキーが押されたのでデータ送信する */ XWSI_DC_WRITE(); /* ホストからのレスポンス待ちを要求 */ resp_flag = ON; break; case RCV_CMP: (6) /* 受信完了 */ 受信完了処理 break; ・ ・
何かキーが押されたらホストにデータを送信するようDC_WRITE を発行します。この関数はすぐに復帰します。通常、この後にDC_READ をWAITモードで呼び出しますが、このアプリケーションでは受信要求フラグ(resp_flag)をONにしてメッセージループに戻るようにします。
PeekMessage を発行して、アプリケーションに通知されたメッセージを取得します。
復帰値により、メッセージの有無を判断してメッセージがある場合はその処理を行います。
メッセージがなく、かつメッセージ処理より受信要求がある時は、ホストからのレスポンスがあるかを、DC_READ を発行して調べます。
もしデータがあれば、SendMessage により受信完了メッセージを送ります。
アプリケーションは受信完了メッセージを受け、受信完了処理を行います。
・プログラミングに注意すべき関数
SENSEモードあるいはNO WAITモードのみ使用して、メッセージループ/プロシージャで使用可能な関数には、以下のものがあります。
キーCRT・インタフェース
KC SEND KC RECEIVE
DUET会話型データ転送インタフェース
DC READ
DUETファイル転送インタフェース
DF WHATIS
また、モード指定がなく時間指定ができる関数がありますが、時間指定をした分だけ自アプリケーションが動作できなくなりますので、WSAPIの時間指定を最小限の1~2秒にしておいてください。システムのタイマ処理と組み合わせて使用可能な関数には以下のものがあります。
キーCRT・インタフェース
KC INFORM KC EWAIT
DUETファイル転送インタフェース
DF WAITSTART DF CANCEL
唯一の例外として、時間指定を充分に取らなければならない関数を以下に示します。
WSMGR 制御インタフェース
WSMGR DISCONNECT
この関数の時間指定は、キー入力可能になることを待ち合わせる応答待ち時間です。時間指定値が小さいと強制終了の形になり処理が中断されてしまうので注意が必要です。
サンプルアプリケーションプログラム WSMAPLでは、応答待ち時間を10秒に設定しています。