3

私のプロジェクトでは、シリアル ポート (RS232) から読み書きする必要があります。オーバーラップ IO を使用しており、読み取りと書き込みに 2 つの個別のスレッドを使用しています。

すぐに完了しない書き込み操作を発行すると、2 つのイベントで待機 (WaitForMultipleObjects) を開始します。オーバーラップされた構造体の hEvent メンバーに割り当てられたイベント、および停止イベント。スレッドを停止する場合は、SetEvent() を呼び出して停止イベントを通知します。これにより、待機関数が戻ります。書き込み操作がまだ保留中のため、CancelIO() を呼び出して操作をキャンセルします。次に、GetOverlappedResult() で bWait パラメーターを True に設定して、操作が完了するのを待ちます。操作が完了すると、GetOverlappedResult() は False を返し、GetLastError() は ERROR_OPERATION_ABORTED を返します。

ここに私の質問があります:

GetOverlappedResult() が False を返し、GetLastError() が ERROR_OPERATION_ABORTED (完了したがキャンセルされた操作を示す) を返す場合、lpNumberOfBytesTransfered パラメータは有効ですか? つまり、lpNumberOfBytesTransfered は、取り消される前に書き込まれた実際のバイト数を教えてくれますか? または、この場合、lpNumberOfBytesTransfered パラメータは未定義ですか?

4

1 に答える 1

3

Hans Passant のコメントを繰り返します。なぜなら、彼は私の質問に正確に答えていると思うからです。

これはドライバーの実装の詳細です。多くの可能なシリアル ポート ドライバーがあり、多くの場合、USB または BlueTooth デバイス ドライバーによってエミュレートされます。品質が疑わしい場合が多い。標準の Microsoft ドライバーは既にノーと言います。IRP がキャンセルされると、IRP.IOStatus.Information フィールドを強制的に 0 にします。データを失う余裕がない場合は、I/O をキャンセルしないでください。

于 2013-10-23T13:34:19.313 に答える