¿Por qué los subprocesos nativos se comportan de forma diferente cuando la aplicación está en segundo plano?

En mi aplicación, uso hilos nativos para procesar datos de audio. El código se parece mucho a esto:

std::thread([this] () { while (enabled) { if (condition()) { process(); } usleep(100); } }); 

Esto funciona bien cuando la aplicación está en primer plano. En segundo plano, el procesamiento no es lo suficientemente rápido como para obtener buffer-underruns. Sólo funciona sin usleep en segundo plano. El valor que paso a usleep no hace la diferencia. No funciona con valores más pequeños también. También intenté std::this_thread::sleep_for(std::chrono::microseconds(100)) pero no hace la diferencia.

Tengo que usar usleep o algo similar para evitar el uso de CPU de alta y por lo tanto para ahorrar batería de por vida.

¿Qué puedo hacer para que los subprocesos nativos se comporten igual cuando la aplicación está en segundo plano?

Parece que Android establece la prioridad Thread para aplicaciones de fondo inferior si no se especifica explícitamente lo contrario. Esta documentación menciona

Generalmente, los subprocesos en el grupo de primer plano obtienen aproximadamente el 95% del tiempo de ejecución total del dispositivo, mientras que el grupo de fondo obtiene aproximadamente el 5%.

Lo que explicaría sus infracciones. Usted debe tratar de aumentar la prioridad como se describe allí. El video enlazado también parece útil.

Puedo estar equivocado, pero parece que debe priorizar su hilo en la CPU. Cuando la aplicación está en segundo plano (o destruida pero con subprocesos en directo), los subprocesos son priorizados por el sistema operativo y su actividad se reduce la mayor parte del tiempo, especialmente si se inicializan con la prioridad predeterminada.

Trate de trabajar con HandlerThread (android.os). De esta manera usted puede definir su prioridad, y en su caso podría intentar THREAD_PRIORITY_AUDIO

Java: (lo siento por no c ++)

 HandlerThread thread = new HandlerThread("MyThread", Process.THREAD_PRIORITY_AUDIO) 
  • Compilación de STXXL bajo Android NDK r8b
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.