Boost::asio::deadline_timer与std::chrono时间值
boost::asio::deadline_timer with std::chrono time values
我有一个使用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上使用g++ 4.7.3 + -std=c++11,交叉编译到arm.
如果您使用的是boost 1.49或更高版本,ASIO引入了basic_waitable_timer,它使用来自std::chrono
或boost::chrono
的c++ 11兼容时钟。它们还为steady_clock
、system_clock
和high_resolution_clock
的boost版本提供了预定义的类型。它的功能与deadline_timer
相同,但使用c++ 11时钟机制而不是boost::posix_time
结构。
对于早期版本,您将不得不传递一个trait结构来处理到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
- 从持续时间构造std::chrono::system_clock::time_point
- 如何在c++迭代器类型中包装std::chrono
- 使用 memcpy() 复制到 std::chrono::milliseconds 会给出错误 -Werror=clas
- std::adjacent_difference with std::chrono time_point
- 是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- 比较两个 std::chrono::time_point 实例时出错
- 来自 std::chrono 的编译器警告,但未被使用
- 从编译时已知的日历日期创建"std::chrono::time_point"
- std::chrono::time_point from std::string
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- What is the std::chrono::time_point equivalent of std::numer
- python equivalent of std::chrono::steady_clock::now();
- std::chrono::duration::count函数的实际结果类型是什么
- C++,自使用boost和std::chrono的纪元以来的时间?为什么 Boost 版本慢 10 倍?
- std::hash for std::chrono::duration
- 如何使用 std::chrono 库设置特定时间?
- C++ 中计时的逻辑错误(使用 std::chrono)
- std::chrono 在从 main 或 from 类方法使用时给出不同的值