0

シリアル ポート経由で非標準モデムを重複して処理しています。通信回線の読み書きの他に、関数を使ってCTSDSRWaitCommEvent()などの制御線をチェックする必要があります。

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変数が宣言されているスコープを安全に離れるために何をする必要がありますか?

4

1 に答える 1

1

あなたが持っているコードは正しく、ドキュメントによって完全にサポートされています。

プロセスがオーバーラップ操作の進行中にSetCommMask関数を使用してデバイス ハンドルのイベント マスクを変更しようとすると、すぐに戻ります。WaitCommEventWaitCommEvent

この事実を「実際の」シリアル ポートと USB 仮想シリアル ポート エミュレーションの両方で使用しましたが、確実に動作します。

(私の特定のケースでは、回線上のEV_TXEMPTY特定の送信間の最小限の分離を保証できるように監視していました)

于 2014-10-10T12:43:46.120 に答える