2012-04-23 6 views
2

私はメソッドwin32::WriteFileを呼び出した後、私はWriteFileコールで使用したのと同じハンドルにWriteFileを呼び出すことは可能ですか?アプリケーションはコールバックを永遠に待つでしょうか?

WaitForSingleObject(handle, INFINITE) 

を呼び出します。

私は永遠に待つようにいくつかのシナリオを持つことができますか?WriteFileは彼の文章を完成させませんか?私は512 kBを書くつもりです。私はハードウェアに問題がないと仮定しています。

私はFAILを取得し、永遠に待つことはないと思います。

+0

非ブロッキング書き込みシステムコールを使用するには、いくつかのフラグでOVERLAPPED IOを使用する必要があります。 – RedX

+0

私は知っている...既にそれを試してください:) – Yanshof

+0

それから私はあなたの質問を理解していない...たぶんあなたはそれを言い換えることができるか、明確にするために少しのコードを投稿する。 – RedX

答えて

1

オーバーラップしたI/Oコールを作成すると、ドライバに責任を委任し、タイムリーに完了するようにします。ドライバにバグがあったり、ハードウェアに機能不全があったりすると、そのような低レベルの操作が失敗した場合でもプログラムを有効な方法で操作し続けることはできません。

ドライバが満たすべきバッファへのポインタを渡したことに注意してください。タイムアウトの終了後に引き続き実行されます。ドライバがのプロセスにバイトをスプライトするときに、実際には要求を完了することができます。あなたは少なくともそれを解決するためにCancelIo()を呼び出さなければなりません。 falseを返す場合は、プロセスを終了します。

これはほとんど意味がありません。オペレーティングシステムからの最低限のサービス保証が必要です。 OVERLAPPEDを使わないでWriteFile()を呼び出すこともできます。同じバギードライバーがあなたのプログラムをハングアップします。 CancelIo()がハングすることはまずありません。それは大丈夫です、それはあなたが問題ではなく、あなたを持っているドライバです。ユーザーがマシンに深刻な問題があることに気付かないようなことではなく、他のプログラムもこの種の不具合に苦しんでいます。

非常に起こりそうなコーナーケースを扱うコードは作成しないでください。そして、とりわけ、効果的にテストできないコードを書かないでください。

+0

ああ待っています...これはIOが重なっていますか? :((何のハンドルがOP待っているのですか? –

1

これは起こるべきではありませんが、それは「最適ではない」ドライバではうまくいきます。とにかく戻ってくる前にネットワーク操作に時間がかかることがあるので、2分(1000 * 60 * 2)という長いタイムアウトを適用し、タイムアウトした場合はwriteFile()を閉じて再開してください。

関連する問題