boost :: deadline_timer :: async_wait不是异步的

时间:2015-01-29 00:30:58

标签: c++ asynchronous boost

我执行一个简单的例子作为测试,我希望在5秒后执行一个简单的操作。我正在使用带有async_wait的boost :: deadline_timer,但async_wait没有异步等待...这是代码:

void print(const boost::system::error_code& /*e*/)
{
  std::cout << "Second Message\n";
}

int main()
{
  boost::asio::io_service io;

  boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
  t.async_wait(print);
  io.run();
  std::cout << "First Message\n";
  return 0;
}

这是输出:

Second Message
First Message

有一个错误,因为计时器必须在后台等待,所以继续执行下一条指令“cout&lt;&lt;”FirstMessage \ n“;”

预期的行为是打印“第一条消息”并打印“第二条消息”


谢谢,我这样解决了:

    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
    t.async_wait(print);
    std::thread thread([&]{io.run();});

2 个答案:

答案 0 :(得分:2)

io.run()仅在其所有作业完成后退出。 尝试安排两个具有不同超时的deadline_times,看看会发生什么。 (或者将io.run()放入另一个线程中。)

答案 1 :(得分:0)

迈克尔说的话。就在昨天,我写了这个样本in chat

<强> Live On Coliru

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

int main() {
    boost::asio::io_service svc;
    boost::asio::deadline_timer timer(svc, boost::posix_time::seconds(2));
    timer.async_wait([](boost::system::error_code ec) { std::cout << ec.message() << '\n'; });

    std::thread th([&] { svc.run(); });

    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "first\n";
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "bye\n";

    th.join();
}

输出:

first
Success
bye