Thread exclusion mutuelle et pb de famine
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:
Code:
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();
}*/
} |
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:
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();
}
} |
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() ).
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