IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Priorité dans les threads


Sujet :

Android

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut Priorité dans les threads
    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.


    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    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.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut onPreview Frame
    Salut TOTO13,
    j'ai une question à te poser j'ai réussi à récupérer les data fournies par onPreviewframe, mon problème c'est que je comprend pas ce qu'il y a dedans j'obture mon device qui me donne une image noire mais des que j'affiche les valeurs de 3 pixels différents data[1] data[milieu data[fin] ça me retourne pas la même valeur ce qui est comme même étrange non,

    secondo pour la conversion en niveau de gris comment faire moi, je fait ça est ce que c'est juste ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    s[i]=(int data[i])
    if((int)data[i]<0)
    {
    s[i]=127-(int)data[i];
    }
    vu que data[i] après que j'ai vérifié est compris entre -128 et 127 (7 bits et 1 bit de signe)

    ma deuxième question est comment chopper l'image suivant vu que data émet en continu je me suis dit qu'il est suffisant de définir un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int[] s= new int[2*w*h]// avec w et h sont width et height de la caméra
    et remplir ce tableau main non quand je compare deux pixel toujours dans le noir je trouve une valeur négative, je ne comprend pas trop aide moi stp

Discussions similaires

  1. Ordre de priorité dans les fonctions gtk
    Par kenshi240683 dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 23/05/2008, 16h12
  2. Imports dans les threads
    Par juju0 dans le forum Général Python
    Réponses: 1
    Dernier message: 24/03/2008, 10h49
  3. Priorité dans les événements ?!
    Par criquety dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/11/2007, 09h59
  4. fonctionnent de la méthode run dans les threads
    Par L4BiN dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 25/07/2006, 11h06
  5. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo