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

5

我正在使用 boost::asio::deadline_timer,来设置 tcp socket 上的一个 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个回答

6

直接解决方案: duration_cast<>:

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

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

仍然不太好。但这是你的密钥。

更好的消息

在任何c++11或更高版本的情况下,只需

#include <boost/asio/high_resolution_timer.hpp>

现在您可以完全使用std::chrono参数化计时器。不再有阻抗不匹配的问题:

在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;

感谢您提供如此详细的答案。您是指 Clock::duration 还是 std::chrono::system_clock::duration - TheWaterProgrammer
你的答案很好,我明白了你的意思,但是我不确定你所说的 Clock::duration timeout = 2000ms; 是什么意思。这段代码无法编译通过。如果改为 std::chrono::system_clock::duration timeout = 2000ms,则会出现一些与时间长度相关的编译错误。 - TheWaterProgrammer
Clock would be a typedef for std::chrono::high_resolution_clock - sehe
在直接解决方案中,seconds 应该改为 milliseconds 吗?boost::posix_time::milliseconds(duration_cast<milliseconds>(2s).count()); - Quokka
1
@Quokka 我也这样认为。干杯。虽然现在我会写 duration / 1s 或者 duration / 1.0ms 等等。 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接