メソッドを呼び出してwin32::WriteFile
から、
WaitForSingleObject( handle, INFINITE )
通話で使用したのと同じハンドルを使用しWriteFile
ます。
私が永遠に待つように、そしてWriteFile
彼の執筆を終わらせないように、いくつかのシナリオを持つことは可能ですか?512 kBを書き込む予定で、ハードウェアに問題はないと想定しています。
私は得ることを期待し、FAIL
永遠に待つことはありません。
メソッドを呼び出してwin32::WriteFile
から、
WaitForSingleObject( handle, INFINITE )
通話で使用したのと同じハンドルを使用しWriteFile
ます。
私が永遠に待つように、そしてWriteFile
彼の執筆を終わらせないように、いくつかのシナリオを持つことは可能ですか?512 kBを書き込む予定で、ハードウェアに問題はないと想定しています。
私は得ることを期待し、FAIL
永遠に待つことはありません。
これは発生しないはずですが、「最適ではない」一部のドライバーでは明らかに発生します。ネットワーク操作は、とにかく戻るまでに時間がかかる可能性があるため、2分(1000 * 60 * 2)の長いタイムアウトを適用し、タイムアウトした場合は、閉じてから再度開いて、writeFile()を再試行することをお勧めします。
重複したI/O呼び出しを行う場合は、ドライバーに責任を委任して、ドライバーがタイムリーに完了するようにします。ドライバーにバグがある場合やハードウェアが機能していない場合にできる合理的なことは何もありません。そのような低レベルの操作が失敗した場合、プログラムは有用な方法で動作し続けることができません。
ドライバーが満たすはずのバッファーへのポインターを渡したことに注意してください。タイムアウトの期限が切れた後も実行を続けると、ダングリングポインターが残ります。これは、ドライバーが実際に完了したときにプロセスにバイトをスプレーするために使用する可能性があります。リクエスト。これを解決するには、少なくともCancelIo()を呼び出す必要があります。そして、falseが返された場合は、プロセスを終了します。
これはほとんど意味がありません。オペレーティングシステムからの最小限のサービス保証が必要です。OVERLAPPEDなしでWriteFile()を呼び出す方がよいでしょう。同じバグのあるドライバーがプログラムをハングさせます。CancelIo()がハングする可能性が低いのと同じように。問題があるのはドライバーであり、あなたではありません。ユーザーがマシンに深刻な問題があることに気付かないわけではありません。他のプログラムもこの種の事故に見舞われます。
非常にありそうもないコーナーケースを扱うコードを書かないでください。そして何よりも、効果的にテストできないコードを書かないでください。