I/Oポートのライブラリ
途中までできた。バッファとファイル間が自由になったヽ(´ー`)ノ
使い心地はこんな。
completion_port port; port.initialize(); parallel_pipeline pipeline(port); HANDLE file=CreateFile(_T("test.txt") ,GENERIC_READ,FILE_SHARE_READ ,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0); file_input_device ifile_dev(file); pipeline >> ifile_dev >> obuffer_dev; pipeline.async(); pipeline.join(); CloseHandle(file); port.finalize();
あぁ・・シンプルでいいかも。
同じ要領でバッファからファイル、バッファからバッファ、ファイルからバッファに対して
非同期I/Oができちゃう。
CreateFileを外側でやってるのはdeviceクラスは
同期/非同期のI/Oをパイプライン的にするためだけに特化したかったため。
もっと言うとI/O自体も関係なくて同期/非同期のコールバックシステムという感じにしました。
そのコールバックにIOCPが使われてて、だからバッファがあるかどうかは任意みたいなつくりになってます。
何日か前に書いた非同期の並列計算処理をパイプライン化みたいなこともがんばればできるかも。
おかげで作るのが余計に大変になった気がします・・・特にWriteFile。
こんなつくりにしたかった理由は、たとえばAcceptEx
これはwinsock2の非同期版acceptでaccept+はじめのデータのReceiveが可能だそうで
まぁデータ自体は受け取るのは任意なのですが、どうやらこれにIOCPが対応してるようで
これもパイプラインに組み込みたいなーと・・・
データがなしの場合にGetQueuedCompletionStatusが反応するかは謎なんですけどねw
それはまたこれから作るってことで
まだまだ試行錯誤は続きます。