cooperの日記: ::GetQueuedCompletionStatus()
日記 by
cooper
を使って、Windows で "tail -f" を実現できないものかと実験中。要は複数のログファイルを監視して、更新があったらリアルタイムで内容を表示したい。個人的な趣味で、MFC は一切使わないようにする。
手始めに SDK 附属のサンプル fwatch.c を元にして、::CreateIoCompletionPort() や ::ReadDirectoryChangesW()、::PostQueuedCompletoinStatus() をクラスメンバに押し込んでみると、なかなか具合が良さそうな雰囲気。::GetQueuedCompletionStatus() を呼び出す監視部分は無限に待つので、::_beginthreadex() でスレッドを生成する。
スレッドルーチンの呼び出し規約は __stdcall が条件なので、クラスの friend 関数へ this を渡して呼び出し、そこからさらに、実質的なスレッドの本体になる private なクラスメンバを this 経由で呼び出すようにする。一人上手なトランポリンはちょっと繁雑。
あとは注目すべきファイルと、それに対するユーザアクションの管理部分を実装すれば、ファイルシステムイベントを汎用的に扱うことができそうな気がする。callback か、::PostMessage() で投げるか、はたまた visitor パターンにすべきか。
それにしても、STL と C ランタイムと Windows API とで命名規則がバラバラで、統一感がないのが美しさに欠けるなぁ。あと、UNICODE ってすごく面倒クサいんだなぁということを、今さらながら実感した。ううむ。
::GetQueuedCompletionStatus() More ログイン