Android设备上的Boost Asio deadline_timer不会在到期时被解雇,但会在稍后的时间点被解雇

时间:2011-01-24 02:11:04

标签: android c++ boost boost-asio

我们正在尝试在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

1 个答案:

答案 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添加额外条件的地方。