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 :

Problème arrêt de certains thread dans une application


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut Problème arrêt de certains thread dans une application
    Bonjour a tous,
    Je viens vers vous parce que je suis en train de créer une application permettant de lire de l'alphacode (je suis en stage). J'utilise donc la caméra.

    J'utilise aussi un thread pour effectuer le calcul puisque le calcul prend plus de 5 secondes et je ne veux pas que mon application s'arrête.

    Mon problème est le suivant lorsque je lance mon application voila les threads qui tourne :

    Les threads du programme sont :

    1 3517 native 15 6 main
    *2 3519 vmwait 2 1 HeapWorker
    *3 3520 vmwait 0 0 GC
    *4 3521 vmwait 0 0 Signal Catcher
    *5 3522 running 0 1 JDWP
    *6 3523 vmwait 0 0 Compiler
    7 3525 native 0 0 Binder Thread #1
    8 3542 native 0 0 Binder Thread #2
    9 3550 native 0 0 Thread-10

    Les threads toujours actifs après fermeture sont :

    1 3517 native 23 10 main
    *2 3519 vmwait 2 1 HeapWorker
    *3 3520 vmwait 0 0 GC
    *4 3521 vmwait 0 0 Signal Catcher
    *5 3522 running 2 4 JDWP
    *6 3523 vmwait 0 1 Compiler
    7 3525 native 0 0 Binder Thread #1
    8 3542 native 0 0 Binder Thread #2

    Enfin, j'ai ces messages dans le logCat

    I/InputQueue-JNI(4924): Sending finished signal for input channel '409c8f50 com.arvalis.client/com.arvalis.client.TestMVCActivity (client)' since it is being unregistered while an input message is still in progress.

    I/InputQueue-JNI(4924): Ignoring finish signal on channel that is no longer registered.

    Je ne sais pas encore pourquoi seul mon thread à moi s'arrête (en tout cas c'est ce que j'en ai déduis puisqu'en débogage mon thread prend fin). Ensuite comme j'utilise la caméra je me suis dis que sa pouvais venir de là camera et j'ai vérifié (débogage) que je relâcher bien ma caméra (avec camera.release() ) Quand je fais system.exit(0) la par contre tout s'arrête mais c'est quand même vachement crade ! Mon gros problème c'est quand je relance l'application impossible d'obtenir un aperçu de ma camera et je peux "forcer l'arrêt" dans mon gestionnaire d'application...

    Merci a tous pour vos réponses je cherche aussi de mon côté si je trouve je vous tiens au courant.

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    Personnellement je n'ai pas bien compris ton problème.
    Si je reformule ce que j'ai cru comprendre :
    Tu as fait une application de scan de code.
    Dans ton application, tu as donc, le thread de la GUI qui affiche le flux de la caméra, et quand c'est nécessaire, tu lances en arrière plan un thread permettant l'analyse d'une image.
    Et maintenant, ton problème c'est que le thread gérant la caméra de libère pas vraiment la caméra à la fin ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    non la caméra est bien libéré mais l'application n'est pas arrêté en fait je ferme mon thread , la camera, activity mais tout les autres thread de base reste ouvert (cité dans mon premier post sont ouvert) du coup quand je relance mon application mes périphériques reste fermé (vue que je n'ai pas de onResume()) et ce que j'aimerais c'est connaitre comment quitter totalement mon application.

  4. #4
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Pas facile de te relire... Essaye de couper un peu plus tes phrases et d'utiliser un peu de ponctuation, ça aide

    Donc en gros, tu quittes ton application, mais quand tu la relances, impossible de récupérer le flux de la caméra car elle est sois disant encore utiliser, c'est ça ?
    A quel moment tu fermes le flux de la caméra ? (et comment ? )
    Quand tu dis "quitter ton application", tu fais comment ? avec la touche "back" du téléphone ou la touche "home" du téléphone ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    En fait, pour quitter mon application il faut:

    - que je détecte dans onKeyDown qu'on a appuyé sur "back" KEYCODE_BACK alors j'appel une fonction

    - de ma classe Observable pour y changer l'état de mon modèle pour le passer en QUIT.(j'ai fait un petit gestionnaire d'état et je passe par sa)

    - et à la fin de cette même fonction j'ai un test sur l'état de mon modèle et si c'est QUIT

    - Je ferme alors ma preview en appellant cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
           public void stopPreview()
    	{
    		if(camera!=null)
    		{
    			Log.i(TAG, "arrêt aperçu");
    			camera.stopPreview();
    		}
    		else
    		{
    			Log.i(TAG, "arrêt aperçu impossible camera = null");
    		}
    	}
    -ensuite j'arrête mon thread j'envoi un Message pris en charge par un handler implémenter en inline à l'intérieur de ma classe dérivant de Thread(voir fin)

    Code : 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
    public void finishHandler()
    	{
     
    		if(thread.isAlive())
    		{
    			Log.i(TAG,"demande Arret du handler et du thread");
                            //envoi d'un message au handler de mon thread On lui envoi R.id.Quit
    			Message quit = Message.obtain(thread.getHandler(), R.id.quit);
    			quit.sendToTarget();
    			try
    			{
    				thread.join();
    			}
    			catch (InterruptedException e)
    			{
    				Log.i(TAG,"Arret impossible du handler et du thread");
    			}
    		}
    		//On s'assure qu'il ne reste pas de message dans la pile
    		removeMessages(R.id.auto_focus);
    		removeMessages(R.id.restart_preview);
    		removeMessages(R.id.decode_succeeded);
    		removeMessages(R.id.decode_failed);
    	}
    Et enfin je ferme relache ma camera et la met à null

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void closeDriver()
    	{
    		if(camera!=null)
    		{
    			Log.i(TAG, "fermeture drivers");
    			camera.release();
    			camera = null;
    		}
    		else
    		{
    			Log.i(TAG, "fermeture drivers impossible camera = null");
    		}
    	}

    et j'appel la fonction finish() de mon activity.

    Voici le code de ma fonction run() de mon thread :

    Code : 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
     
            @Override
    	public void run()
    	{
    		Looper.prepare();
    		handler = new Handler()
    		{
    			@Override
    			public void handleMessage(Message message)
    			{
    				switch (message.what)
    				{
    				case R.id.decode:
    					if (!decoding)
    					{
    						decoding = true;
    						Log.i(TAG, "demande de decodage photo");
    						decode((byte[]) message.obj, message.arg1, message.arg2);
    						decoding = false;
    					}
    					break;
     
    				case R.id.quit:
    					Log.i(TAG, "demande d'arrêt du thread");
    					Looper.myLooper().quit();
    					break;
    				}
    				removeMessages(R.id.decode);
    				removeMessages(R.id.quit);
    			}
    		};
    		Looper.loop();
    	}
    ps : désoler pour la ponctuation j'oublierais pas d'en mettre ;-)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    J'ai trouvé la solution pour pouvoir relancer la caméra en fait j'arrêté ma camera sans mettre mon controleurCamera = null or je ne réinitialisais ma Camera que quand mon controleurCamera = null.

    Mais les threads cité précédemment sont toujours actif

    ps:désoler pour le double post

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 168
    Points : 212
    Points
    212
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Liste des threads en cours
    Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
     
    //Tableau des threads en cours
    Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
     
     
    //Parcours du tableau de threads
    for (Thread thread : threadArray) {
    	if(thread.getName().equals("----- NOM DU THREAD A ARRETER -----")) {
    		thread.interrupt();
    	}
    }


    A essayer, je ne suis pas trop sûr pour le interrupt.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Merci pour ton aide je vais essayer

Discussions similaires

  1. Gestion des threads dans une application swing
    Par MaxLaMenaX dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 10/11/2010, 22h46
  2. Problème de gestion de suppression dans une application web dynamic data
    Par mo5andes dans le forum Développement Web avec .NET
    Réponses: 4
    Dernier message: 21/06/2010, 10h35
  3. Problème d'envoi de mail dans une application web
    Par BNacer dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 11/12/2009, 22h22
  4. Réponses: 5
    Dernier message: 09/09/2009, 13h26
  5. Problème de terminaison de thread dans une DLL
    Par johjoh dans le forum Langage
    Réponses: 4
    Dernier message: 25/09/2008, 18h29

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