Boost Asio deadline_timer на устройстве Android не запускается по истечении срока действия, но в более поздний момент времени - PullRequest
4 голосов
/ 24 января 2011

Мы пытаемся использовать boost asio deadline_timers на устройстве Android.у нас есть требование, когда нам нужно запускать таймер каждые 100 мсек.Я использовал код следующим образом.Однако таймер срабатывает каждые 1 секунду.Что мы должны точно настроить в системе Android, чтобы таймер крайнего срока boost 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 Ответ

1 голос
/ 15 марта 2011

Возможно, вы захотите убедиться, что в вашей среде Android в конечном итоге будет определено BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK .

Если вы посмотрите на значения по умолчанию timer_traits в boost/asio/time_traits.hpp, вы увидите, что еслиэто не определено, 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.

...