IO Completion Portで非同期のWriteFile

延々デバッグでしたまる


/^o^\


WriteFileを呼び出し続けてERROR_IO_PENDINGがくるとGetOverlappedResultの最後の引数をTRUEにして

書き込みを待機しないとちゃんと書き込めないという現象がおきていました。

もちろんGetQueuedCompletionStatusから『完了しました』ってエラーもなく通知が来るものだから

ものすごい勢いでWriteFileしてたんだけど、書き込んだファイルみたらちゃんと書き込めてないの

だからって非同期I/Oが売りなのにGetOverlappedResultで待機するなんて意味がない。したくないヤダヤダ><

ReadFileはちゃんとできてるのになあ・・


んでいろいろと考えたんですが、延々考えて最後にぱっとひらめいたのがWinsockのFD_WRITE

FD_WRITEは書き込みが『完了しました』じゃなくてバッファが開いたなどの理由で『書けるようになったよ』だったはず

たぶんこれもそんな感じなんだろーとWriteFileしてGetQueuedCompletionStatusが帰ってきたらWriteFileして・・・

とするように変更したらうまくかけた━━━━━。゚(゚´Д`゚)゚。━━━━━よ!!!!


ちなみに実行速度のほうも上のやり方で問題なさそうです。

ものすごい勢いでWriteFileしてもI/O自体の転送速度が上がるわけじゃないからねぇ・・


それにしても完了ポートとか、なんてややこしい名前なんだお