Boost 1.49.0から入ったwindows::object_handleは、Windows上におけるHANDLEの非同期操作を行うためのクラスです。
以下は、プロセスの終了まで待機する処理:
#include <iostream> #include <string> #include <boost/asio.hpp> #include <boost/asio/windows/object_handle.hpp> namespace asio = boost::asio; void on_end_process(const boost::system::error_code& ec) { if (!ec) { std::cout << "end process" << std::endl; } } int main() { asio::io_service io_service; PROCESS_INFORMATION pi = {}; STARTUPINFO si = {}; si.cb = sizeof(si); std::string proc = "notepad"; CreateProcess(NULL, &proc[0], NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); asio::windows::object_handle process(io_service, pi.hProcess); process.async_wait(on_end_process); io_service.run(); }
これを動かすとメモ帳が起動し、メモ帳を閉じると「end process」と出力されます。
object_handleのwait/async_waitは、内部でWaitForSingleObjectを呼んでいます。
プロセス以外にも、CreateEventで作ったハンドルを、SetEventされるまで待機するのにも使用できます。
この機能は元々、Boost.ProcessのためにBoris Schaelingさんが作ったもののようです。
Call for Submissions - boost-users