2

メソッドを呼び出してwin32::WriteFileから、

WaitForSingleObject( handle, INFINITE )

通話で使用したのと同じハンドルを使用しWriteFileます。

私が永遠に待つように、そしてWriteFile彼の執筆を終わらせないように、いくつかのシナリオを持つことは可能ですか?512 kBを書き込む予定で、ハードウェアに問題はないと想定しています。

私は得ることを期待し、FAIL永遠に待つことはありません。

4

2 に答える 2

1

これは発生しないはずですが、「最適ではない」一部のドライバーでは明らかに発生します。ネットワーク操作は、とにかく戻るまでに時間がかかる可能性があるため、2分(1000 * 60 * 2)の長いタイムアウトを適用し、タイムアウトした場合は、閉じてから再度開いて、writeFile()を再試行することをお勧めします。

于 2012-04-23T11:22:25.043 に答える
1

重複したI/O呼び出しを行う場合は、ドライバーに責任を委任して、ドライバーがタイムリーに完了するようにします。ドライバーにバグがある場合やハードウェアが機能していない場合にできる合理的なことは何もありません。そのような低レベルの操作が失敗した場合、プログラムは有用な方法で動作し続けることができません。

ドライバーが満たすはずのバッファーへのポインターを渡したことに注意してください。タイムアウトの期限が切れた後も実行を続けると、ダングリングポインターが残ります。これは、ドライバー実際に完了したときにプロセスにバイトをスプレーするために使用する可能性があります。リクエスト。これを解決するには、少なくともCancelIo()を呼び出す必要があります。そして、falseが返された場合は、プロセスを終了します。

これはほとんど意味がありません。オペレーティングシステムからの最小限のサービス保証が必要です。OVERLAPPEDなしでWriteFile()を呼び出す方がよいでしょう。同じバグのあるドライバーがプログラムをハングさせます。CancelIo()がハングする可能性が低いのと同じように。問題があるのはドライバーであり、あなたではありません。ユーザーがマシンに深刻な問題があることに気付かないわけではありません。他のプログラムもこの種の事故に見舞われます。

非常にありそうもないコーナーケースを扱うコードを書かないでください。そして何よりも、効果的にテストできないコードを書かないでください。

于 2012-04-23T12:57:38.373 に答える