我们正在尝试在Android设备上使用boost asio deadline_timers。我们有一个要求,我们需要每100毫秒发射一个计时器。我使用了如下代码。然而,计时器似乎每1秒被发射一次。我们应该如何在Android系统中微调,以便提升asio截止时间计时器按预期工作?
注意:以下代码在普通Linux系统上按预期工作。是什么让它在Andorid系统上的工作方式不同?
代码:
void print(asio::deadline_timer* ptimer, const asio::error_code& err)
{
struct timeval tval;
if(0 == gettimeofday(&tval, NULL))
{
std::cout <<" Timer... sec::microsec = "<<tval.tv_sec<<"::"<<tval.tv_usec<< std::endl;
}
else
{
std::cout <<" Timer... gettimeofday Error!" << std::endl;
}
ptimer->expires_from_now(boost::posix_time::milliseconds(100));
ptimer->async_wait(boost::bind(&print, ptimer, asio::placeholders::error));
}
在Android设备上输出
Timer... sec::microsec = 1298328679::39207
Timer... sec::microsec = 1298328680::46773
Timer... sec::microsec = 1298328681::54624
Timer... sec::microsec = 1298328682::63861
Timer... sec::microsec = 1298328683::65740
Timer... sec::microsec = 1298328684::69301
Timer... sec::microsec = 1298328685::76500
Timer... sec::microsec = 1298328686::85768
答案 0 :(得分:1)
您可能希望确保您的Android环境最终定义了 BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK 。
如果您查看boost/asio/time_traits.hpp
中的默认timer_traits,您会看到如果未定义,则asio将使用 second_clock 作为其计时器。
此定义来自boost/date_time/compiler_config.hpp
,以 BOOST_HAS_GETTIMEOFDAY 或 BOOST_HAS_FTIME 为条件。举个例子,大概应该定义前者。
我不知道android是否被认为是自己的平台,或者如果boost将其检测为linux。在boost/config/platform/linux.hpp
中,它被定义为:
// // If glibc is past version 2 then we definitely have // gettimeofday, earlier versions may or may not have it: // #if defined(__GLIBC__) && (__GLIBC__ >= 2) # define BOOST_HAS_GETTIMEOFDAY #endif
这可能是你想为android添加额外条件的地方。