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

Concurrence et multi-thread Java Discussion :

Terminer un Thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut Terminer un Thread
    Bonjour,

    Le programme ci-dessous a pour mission de lire des badges magnétiques à partir d'une connexion Series RS232. Tout marche bien pour ce qui est de la lecture des badges. Les numéros lus sont stockés dans un vecteur.
    Toutefois si, après 10 secondes, aucun nouveau badge n'est lu, je veux terminer mon programme. J'obtiens bien le message "Timeout détecté" ce qui prouve que je sors bien de ma boucle et le message "Programme terminé".

    Cependant en réalité, mon programme ne se termine pas. Je suppose que l'instruction t.interrupt() n'a aucun effet et que le thread reste actif. La classe SerialReader invoquée par :
    sr = new SerialReader(in);
    lance des instructions pour se mettre à l'écoute d'un numéro reçu du lecteur de badge. Lorsque le numéro est lu un retour à la classe appelante est réalisé. A mon avis, comme aucun autre badge n'a été passé devant le lecteur, cette classe ne retourne rien et donc reste à l'écoute (mais je n'en suis pas certain).

    Y-a-t-il un moyen de forcer (proprement) ce thread à se terminer. J'ai pensé à lancer " serialPort.close();" avant t.interrupt(); mais je ne suis pas sûr que ce serait la bonne solution.

    Merci d'avance pour tout conseils ou critiques.

    Gérard

    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
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    import gnu.io.CommPort;
    import gnu.io.CommPortIdentifier;
    import gnu.io.SerialPort;
     
    import java.io.InputStream;
     
    	public class LectureBadges implements Runnable
    	{
    		InputStream in= null;
    		java.util.Vector v_badges = null;
    		protected  int maxBadges = 0;
    		// static boolean threadStop = false;
    	    public LectureBadges() throws Exception
    	    {
    	        super();
    	        v_badges  =  new java.util.Vector();
    	        connect("COM1");
    	        return;
    	    }
     
    	    void connect ( String portName ) throws Exception
    	    {
    	        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
    	        if ( portIdentifier.isCurrentlyOwned() )
    	        {
    	            System.out.println("Erreur: Ce port est actuellement utilisé");
    	            return;
    	        }
     
    	        	CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
     
    	        	SerialPort serialPort = (SerialPort) commPort;
    	        	serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
     
    	        	in = serialPort.getInputStream();
     
    	        	startProcess();
    	        	System.out.println("Taille du vecteur = " + v_badges.size());
    	            System.out.println("Terminé");
    	            serialPort.close();
    	    }  
    	    public  void startProcess() 
    	    {
    	    	try 
    	    	{
    		    	Thread t = new Thread(this);
    		    	int oldMax = 0;
    		    	System.out.println("Lecture des badges activée. J'attends....");
    		    	t.start();
    		    	while (true) 
    		    	{ 
    		    		t.join(10000);
    		    		if (maxBadges <= oldMax)  // pas de nouveau badge
    		    		{
    		    			if (t.isAlive()) t.interrupt();
    		    			System.out.println("TimeOut détecté. ");
    		    			break;
    		    		}
    		    		oldMax=maxBadges;
    		    	}
    		    	t=null;
    	    	}
    	    	catch (Exception ex ){}
    	    }	 
    	    public void run ()
    	    {
    	    	try 
    	    	{
    		    	while (true)
    	            {
    		        	SerialReader sr = new SerialReader(in);
    		        	v_badges.add(maxBadges++,sr.badge);
    	            }
    	    	}
    	    	catch (Exception ex){System.out.println(ex.toString());}
    	    } 
     
    	    public static void main ( String[] args )
    	    {
    	        try
    	        {
    	             new LectureBadges() ;
    	             System.exit(0);
     
    	        }
    	        catch ( Exception e )
    	        {
    	            e.printStackTrace();
    	        }
    	    }
    }

  2. #2
    Membre éprouvé
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Points : 1 042
    Points
    1 042
    Par défaut
    Bonsoir,
    Ton break te fait sortir du if pas de ta boucle while si je ne me trompe pas!
    Docteur en informatique
    Freelance R&D, Web
    Activité freelance : https://redinnov.fr
    Page perso : https://michel-dirix.com/

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    @michel.di : Tu te trompes, essayes ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static void main(String args[])
    	{
     
    		int i = 0;
    		while (true)
    		{
    			if (i++>2)
    				if (i>4)
    				break;
     
    		}
     
    		System.err.println("fini : "+i);
    	}
    Sinon pour terminer un thread tu peux aussi regarder ceci :http://java.developpez.com/faq/java/...HREAD_terminer
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut J'ai résolu mon problème....
    Merci a tous ceux qui m'ont répondu. En fait, j'ai réussi à résoudre mon problème en supprimant la manipulation des threads et en utilisant le Timeout de la gestion des connexions RS232. Et ça marche au poil.
    Merci encore.

    Gérard

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. dans quel cas terminer un thread? thread.Abort()
    Par mnemonic78 dans le forum C#
    Réponses: 3
    Dernier message: 08/11/2008, 16h51
  2. wxThread : terminer un thread détaché
    Par 3DArchi dans le forum wxWidgets
    Réponses: 4
    Dernier message: 08/11/2008, 15h47
  3. Problème pour terminer un thread
    Par BestFF dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 05/07/2008, 22h03
  4. [windows] une classe qui crée et termine un thread
    Par Biosox dans le forum Windows
    Réponses: 11
    Dernier message: 07/06/2007, 10h52
  5. [Threads] Comment terminer un thread ?
    Par Wookai dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 16/04/2005, 13h25

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