Je suis en train de coder un driver de lecture de données via le port série. Je stocke les données d'entrée dans un Byte[] (InputBuffer).
Un thread surveille la réception pour remplir le buffer d'entrée. voici le code:
Un autre thread s'occupe d'afficher les données. ce dernier est réveillé dès la réception d'une donnée pour le premier thread (notifyAll()). Voici le code:
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 synchronized public void AddData(byte[] RxMsg){ //try { //wait(); if (InputBuffer.length > 0){ byte[] tmp = new byte[InputBuffer.length + RxMsg.length]; System.arraycopy(InputBuffer, 0, tmp, 0, InputBuffer.length); System.arraycopy(RxMsg, 0, tmp, InputBuffer.length, RxMsg.length); InputBuffer = tmp; } else InputBuffer = RxMsg.clone(); notifyAll(); /*} catch (InterruptedException e) { e.printStackTrace(); }*/ }
Tout se passe bien, je reçois bien les données sans perte. Mon problème et qu'avec se programme je dois attendre que le buffer soit vidé (boucle en rouge) pour le re-remplir par les données reçus (méthode AddData() ).
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 synchronized public void run() { while(enable){ do{ try { wait(); //passive waiting } catch(InterruptedException ie) { ie.printStackTrace(); } }while (InputBuffer.length < 5); // 5 is min size of message do{ display.asyncExec(new Runnable(){ public void run(){ DecodeInputMsg(); InTrameViewer.setInputBuffer(InputBuffer.length); } }); }while (InputBuffer.length > 0); // 5 is min size of message //notifyAll(); } }
Ce que j'aimerai, c'est que des que je reçois une donnée (méthode AddData() ) je puisse mettre en pause la boucle en rouge pour ajouter les données à InputBuffer et ensuite reprendre la boucle en rouge.
Tout mes essais se sont terminés par le blocage des deux threads.
Je remercie par avance toutes personnes pouvant m'aider à résoudre se problème
Partager