シリアル ポート経由で非標準モデムを重複して処理しています。通信回線の読み書きの他に、関数を使ってCTSやDSRWaitCommEvent()
などの制御線をチェックする必要があります。
DWORD EvtMask;
/// (some scopes/levels ommitted)
const BOOL syncChange = WaitComEvent(hFile, &EvtMask, &overlapped);
if (!syncChange) {
assert(GetLastError() == ERROR_IO_PENDING);
/// *background activity* probably writing into EvtMask
/// until overlapped.hEvent gets signalled
}
関数呼び出しが示す (事実上すべての) ケースでは、 が発生*background activity*
するのを待つ必要がありoverlapped.hEvent
ます。別のソース (ユーザー入力による IPC、プログラムの終了など) からのイベントも待っているので、WaitForMuiltipleObjects()
関数を使用します。しかし、制御ラインの変更以外の理由でブロッキング待機が終了した場合、バックグラウンド アクティビティを停止するにはどうすればよいEvtMask
ですか? 私が基にしているコードは現在 を使用SetCommMask(hFile, 0)
していますが、これが適切であるという信頼できる参照が見つかりませんでした。
また、制御ラインへの変更が適切にサポートされていないケース (ドライバー?、VM?) も観察しているため、その間にチェックを入れてスライス待機を行う必要があります。
EvtMask
変数が宣言されているスコープを安全に離れるために何をする必要がありますか?