在一段时间后停止boost :: io_service

时间:2014-03-26 10:51:58

标签: c++ boost

我有一个boost :: asio :: io_service正在做一些工作。现在我想在一段时间后停止这项服务。我的第一种方法是使用boost::thread(io_service.run()),但后来我得到了错误 还有其他方法可以阻止io_service吗? 谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用deadline_timer

您也可以像尝试的那样在另一个线程上运行该服务:

boost::thread t = boost::thread(boost::bind(&boost::asio::io_service::run, boost::ref(io_service));

// sometime
io_service.stop(); // io_service is threadsafe
t.join();

这是在C ++ 03中完成的deadline_timer示例: Live On Coliru

#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/asio/deadline_timer.hpp>
#include <iostream>

using namespace boost::asio;
using namespace boost;

io_service svc;
deadline_timer timer(svc);

void work()
{
    this_thread::sleep_for(chrono::milliseconds(100));
    std::cout << "Work done, rescheduling\n";
    svc.post(work);
}

void expiration_handler(system::error_code ec)
{
    if (ec != error::operation_aborted)
        svc.stop();
}

int main()
{
    svc.post(work);

    timer.expires_from_now(posix_time::seconds(2));
    timer.async_wait(expiration_handler);

    svc.run();
}

打印

Work done, rescheduling

直到2秒后达到截止日期

答案 1 :(得分:1)

<击>

<击>
std::this_thread::sleep_for(std::chrono::seconds(10));
io_service.stop();

不是吗?


使用deadline_timer

boost::asio::deadline_timer stop_timer(io_service);

...
// If require stopping
stop_timer.expires_from_now(boost::posix_time::seconds(10));
stop_timer.async_wait(
    [&io_service](const boost::system::error_code &ec)
    {
        io_service.stop();
    });