gpt4 book ai didi

c++ - boost::asio::deadline_timer 与 std::chrono 时间值

转载 作者:IT老高 更新时间:2023-10-28 22:35:02 29 4
gpt4 key购买 nike

我有一个使用 asio 截止时间计时器的应用程序。应用程序的其余部分使用 std::chrono 构造作为其时间值,并且仅对涉及 asio 的内容使用 boost::posix_time 感觉很尴尬。如果可以的话,我想在整个应用程序中使用 std::chrono 以保持一致性、可读性等。

在我看来,答案将涉及使用计时器的模板:

typedef boost::asio::basic_deadline_timer<std::chrono::system_clock::time_point>
my_deadline_timer_type;
my_deadline_timer_type a_timer(io_service);

除了这在编译时严重崩溃...许多错误行,其中大部分与此类似:

/opt/arm/include/boost/asio/deadline_timer_service.hpp:51:43: error: invalid use of incomplete type 'boost::asio::deadline_timer_service > >, boost::asio::time_traits > > > >::traits_type {aka struct boost::asio::time_traits > > >}'

所以,看起来我可能需要创建一个新的 traits_type 并使用它声明一个 deadline_timer_service,但我不确定如何/在哪里。我必须相信这个问题已经解决了。我在 linux 上使用带有 -std=c++11 的 g++ 4.7.3,交叉编译到 arm。

最佳答案

如果您使用 boost 1.49 或更高版本,ASIO 引入了 basic_waitable_timer ,它使用来自 std::chronoboost::chrono 的 C++11 兼容时钟。他们还为 steady_clocksystem_clockhigh_resolution_clock 的 boost 版本提供了预定义的 typedef。它的功能与 deadline_timer 相同,但使用 C++11 时钟机制而不是 boost::posix_time 结构。

对于早期版本,您将必须传递一个特征结构来处理转换为 deadline_timer 期望的类型。请参阅 ASIO TimeTraits要求。大多数是微不足道的,最后一个不是。所以,例如

template<typename Clock>
struct CXX11Traits
{
typedef typename Clock::time_point time_type;
typedef typename Clock::duration duration_type;
static time_type now()
{
return Clock::now();
}
static time_type add(time_type t, duration_type d)
{
return t + d;
}
static duration subtract(time_type t1, time_type t2)
{
return t1-t2;
}
static bool less_than(time_type t1, time_type t2)
{
return t1 < t2;
}

static boost::posix_time::time_duration
to_posix_duration(duration_type d1)
{
using std::chrono::duration_cast;
auto in_sec = duration_cast<std::chrono::seconds>(d1);
auto in_usec = duration_cast<std::chrono::microseconds>(d1 - in_sec);
boost::posix_time::time_duration result =
boost::posix_time::seconds(in_sec.count()) +
boost::posix_time::microseconds(in_usec.count());
return result;
}
};

然后,您将为要使用的每个 C++11 时钟创建截止时间计时器。此处的示例适用于 std::system_clock。您可以正常使用此截止时间计时器。

typedef boost::asio::basic_deadline_timer< 
std::system_clock,
CXX11Traits<std::system_clock>> my_system_clock_deadline_timer

关于c++ - boost::asio::deadline_timer 与 std::chrono 时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16721243/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com