如何将`std :: chrono :: milliseconds`转换为`boost :: posix_time :: milliseconds`

时间:2017-11-29 22:53:52

标签: c++ c++11 boost boost-asio chrono

我正在使用boost :: asio :: deadline_timer,以便在 tcp套接字上的async_read操作之前设置一些超时。我正在使用 boost 1.61

long time_out_millis = 2000;
boost::asio::deadline_timer theTimer(theSocket.get_io_service(), boost::posix_time::milliseconds(time_out_millis));

问题:
我的代码的其他部分使用std::chrono::milliseconds。我希望使用std::chrono代替"long time_out_millis"&如果可能,请使用std::chrono::milliseconds代替boost::posix_time::milliseconds。我怎么能这样做?

问题:
那么,我如何在这里使用std::chrono::milliseconds?我是否有从std::chrono::milliseconds投射到boost::posix_time::milliseconds的方式?

1 个答案:

答案 0 :(得分:4)

直接解决方案:duration_cast<>

using namespace std::chrono;
using namespace std::chrono_literals; 

boost::posix_time::seconds(duration_cast<milliseconds>(2s).count());

仍然不好。但这是你的关键。

更好的消息

在任何c ++ 11或更高版本的场景中,只需

#include <boost/asio/high_resolution_timer.hpp>

享受std::chrono从下到上完全参数化的计时器。不再有阻抗不匹配:

<强> Live On Coliru

#include <boost/asio/high_resolution_timer.hpp>
using namespace std::chrono_literals;

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

    boost::asio::high_resolution_timer tim(svc);

    tim.expires_from_now(1s);
    tim.expires_from_now(100ms);
    tim.expires_from_now(3h);
    tim.expires_from_now(15'000us);
    tim.expires_from_now(15'000'000ns);
}

注意这会改变你的

long time_out_millis = 2000;

这样的东西
Clock::duration timeout = 2000ms;