Boost Asio deadline_timer en el dispositivo Android no se disparó en el momento de expiración, pero en un momento posterior del tiempo

Estamos tratando de utilizar boost asio deadline_timers en un dispositivo android. Tenemos un requisito donde necesitamos disparar un temporizador cada 100 ms. He utilizado el código de la siguiente manera. Sin embargo, el temporizador parece ser disparado cada 1 segundo. ¿Qué debemos afinar en el sistema Android para el impulso de temporizador de plazo de asio para funcionar como se espera?

Nota: el código siguiente funciona como se espera en un sistema Linux estándar. ¿Qué hace que funcione de manera diferente en un sistema Andorid?

Código :

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)); } 

Salida en un dispositivo 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 

Es posible que desee asegurarse de que su entorno Android acabe teniendo BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK definido.

Si echa un vistazo a los timer_traits por defecto en boost/asio/time_traits.hpp , verá que si esto no está definido, asio utilizará el segundo_clock como su temporizador.

Esta definición viene de boost/date_time/compiler_config.hpp , condicional a BOOST_HAS_GETTIMEOFDAY o BOOST_HAS_FTIME . Dado su ejemplo, presumiblemente el primero debe ser definido.

No sé si android se considera su propia plataforma o si el impulso lo detecta como linux. En boost/config/platform/linux.hpp se define como:

 //
 // Si glibc es pasado la versión 2 entonces definitivamente tenemos
 // gettimeofday, las versiones anteriores pueden tener o no:
 //
 #if defined (__ GLIBC__) && (__GLIBC__> = 2)
 # Define BOOST_HAS_GETTIMEOFDAY
 #terminara si

Esto es probablemente donde usted quiere agregar una condición adicional para android.

  • ¿Hay una manera de escribir iphone y aplicaciones de Android usando Visual Studio y c #?
  • Error 'IL_LIB_JPEG_ERROR 1506' usando DevIL
  • No se pueden incluir archivos de encabezado STL con Android NDK r5
  • Convierta C.jstring a cadena nativa en Go
  • Devuelve jbyteArray desde c nativo en Android
  • Error de segmentación al usar dlclose (...) en la plataforma android
  • Qt en Android: el código C ++ se ejecuta en la máquina virtual Dalvik
  • ¿Cómo implementar mbtowc para android? (O, idealmente, ¿cómo no hacerlo?)
  • ¿Cómo ejecutar ejecutar aplicaciones C ++ en android?
  • Acelerar la función de zoom en ImageView
  • ¿Los comentarios afectan el tiempo de compilación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.