Aller au contenu

Priorité dans les threads


FiReTiTi

Recommended Posts

Bonjour,

je réalise une appli qui fait du traitement vidéo et j'ai un petit problème de priorité entre mes threads. Plus particulièrement, un problème de priorité entre le thread principal qui contient toute l'appli et ceux que je crée dans mon appli.

Je m'explique par le petit morceaux de code basique qui suit (code de base des exemples android) :

- j'ai un classe Preview qui gère l'affichage.

- j'ai ajouté un callback pour récupérer mon flux vidéo.

- dans ce callback, j'ai effectué mes traitement dans un thread.

- j'ai donné une priorité maximale à ce thread.

Note : il s'agit là d'un thread basique peut esthétique et optimisé, mais là n'est pas le problème.

public class Preview extends SurfaceView implements SurfaceHolder.Callback
{

private SurfaceHolder mHolder ;
private Camera mCamera ;

...

public Preview(Context context)
{
super(context) ;
// Install a SurfaceHolder.Callback so we get notified when the underlying surface is created and destroyed.
mHolder = getHolder() ;
mHolder.addCallback(this) ;
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ;
}



public boolean onWork = false ;

public void surfaceCreated(SurfaceHolder holder)
{
// The Surface has been created, acquire the camera and tell it where to draw.
mCamera = Camera.open() ;


mCamera.setPreviewCallback(
	new PreviewCallback()
		{
		public void onPreviewFrame(final byte[] data, final Camera camera)
			{
			if ( !onWork )
				{
				Runnable r = new Runnable()
					{
					public void run()
						{
						onWork = true;

						// Je fais mon boulot ici...

						onWork = false;
						}
					};

				Thread thread = new Thread(r) ; // Création du thread
				thread.setPriority(Thread.MAX_PRIORITY) ; // Ajustement de la priorité
				thread.start() ; // Lancement du thread.
				}
			}
		}
	) ;

try	{
	mCamera.setPreviewDisplay(holder) ; // Mise à jour de l'affichage
	}
catch ( Exception e )
	{
	mCamera.release() ;
	mCamera = null ;
	}
}

...

// Dans la suite toutes les autres méthodes
//public void surfaceDestroyed(SurfaceHolder holder)
//private Size getOptimalPreviewSize(List<Size> sizes, int w, int h)
//public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
}

Malheureusement, quoi que l'on fasse, les traitements que l'on réalise dans nos applications (avec ou sans thread) se déroulent dans le thread principal qui s'occupe entre autre de récupérer le flux vidéo.

Et c'est là tout mon problème : le thread principal prend beaucoup (trop) de temps pour lire la vidéo et mon thread de traitement (qui est assez lourd) n'a plus assez de ressource. On a donc deux solutions :

- 1 - baisser la priorité du thread principal pour maximiser le temps accordé au thread de traitement.

- 2 - synchroniser le thread principal pour qu'il ne lise une image QUE lorsque mon traitement est terminé. Mais on perd alors la fluidité de la vidéo.

Je pense que le mieux est la première solution, en raison du problème évoqué dans la deuxième.

Mais comment faire ?

Merci par avance.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...