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();
	        }
	    }
}