読者です 読者をやめる 読者になる 読者になる

Boost.Asio windows::object_handle

C++

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