[Java] [LeJOS] Probleme de Listener en parallèle

Probleme de Listener en parallèle [Java] [LeJOS] - Java - Programmation

Marsh Posté le 26-01-2005 à 11:26:42    

Bonjour,
 
J'essaie actuellement de programmer un robot en LeJOS (Java pour Lego).
J'utilise pour cela des Listener commandant des Thread, et je souhaiterais que l'un des listener ait toujours la priorité sur l'autre, qu'il puisse ainsi l'interrompre (eviter de rentrer dans un mur par exemple).  
Cependant, j'aimerais qu'une fois l'execution du listener prioritaire terminée, la classe qui avait été interrompue reprennent là où elle en etait.
J'ai déjà essayé setPriority() mais cela ne change rien.
Voila ce qui se passe :  
Le robot commence normalement le programme, ne se cogne pas dans les mur tant que l'autre listener n'est pas activé, mais quand j'active l'autre listener, le robot bug.
Je pense qu'il est possible d'utiliser des Synchronize, mais je ne connais pas la syntaxe et ne vois pas trop comment l'inclure dans l'architecture du programme.
Désolé d'avoir été aussi long, et merci d'avance pour vos réponse.
 
Olivier.
 

Reply

Marsh Posté le 26-01-2005 à 11:26:42   

Reply

Marsh Posté le 26-01-2005 à 11:40:10    

tu ne peux pas intérompre le déroulement normal d'un thread depuis un autre thread ... il faut que le thread en question ait été prévu de façon à ce qu'on puisse lui signaler qu'il doit faire autre chose. En gros, il doit être à l'écoute d'evenement qui vont lui dire d'arrêter ce qu'il est en train de faire et de faire autre chose.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 26-01-2005 à 12:29:26    

lejos [:xx_xx]  
 
 
[:blueflag] ! olivier180, fait peter des tofs et des bouts de code! :love:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 26-01-2005 à 14:54:10    

Merci.
 
Comme je n'ai pas trouvé de solution, j'ai essayé de simplifier le problème. J'ai maintenant 1 seul listener, et un programme main.
Dans le programme main, le robot tourne a l'infini et est à l'écoute du listener. Le listener affiche la zone dans laquelle se trouve le robot. Cependant, au bout d'un moment, j'obtiens une erreur, et je pense que c'est un "OutOfmemory"  
(J'obtiens une erreur 0068^5, 0068 etant la signature d'un statechanged)
 
Voila le code:
 
Main :
 
public class Ebauche {
 
 public static void main(String[] args) {
 
  Sensor.S2.activate();
 
  Sensor.S2.setTypeAndMode(3,0x80);
   
  Sensor.S2.addSensorListener(new Listen());
 
  Motor.A.setPower(7);
  Motor.C.setPower(7);
 
  while (true) {
   Mouvements.RotateRight();
  }
 }
}
 
 
listener :
 
public class Listen implements SensorListener {
 
 public void stateChanged(Sensor s, int old, int nu) {
   
  if (nu < 40) {
   TextLCD.print("Noir" );
  }  
   
  else if (44 < nu && nu < 47) {
   TextLCD.print("fonce" );
  }  
   
  else if (46 < nu && nu < 50) {
   TextLCD.print("clair" );
  }  
   
  else if (49 < nu && nu < 53) {
   TextLCD.print("tclair" );
  }  
   
  else if (52 < nu) {
   TextLCD.print("bord" );
  }

Reply

Marsh Posté le 26-01-2005 à 15:04:13    

je vois pas trop où ton prog pourrait faire un outofmemory ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 26-01-2005 à 15:05:17    

bah faut voir ce que font toutes ces methodes statiques qu'il appelle...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 26-01-2005 à 15:13:56    

Merci
voici la classe que j'ai créé pour simplifier les commandes de déplacement:
 
import josx.platform.rcx.*;
 
import java.lang.*;
import java.util.*;
 
public class Mouvements {
 
 public static void GoForward() {
  Motor.A.forward();
  Motor.C.forward();
 }
 
 public static void GoBackward() {
  Motor.A.backward();
  Motor.C.backward();
 }
 
 public static void TurnLeftForward() {
  Motor.C.forward();
  Motor.A.stop();
  AngleRotation.Angle=AngleRotation.Angle-1;
 }
 
 public static void TurnRightForward() {
  Motor.C.stop();
  Motor.A.forward();
  AngleRotation.Angle=AngleRotation.Angle+1;
 }
 
 public static void RotateLeft() {
  Motor.C.forward();
  Motor.A.backward();
  AngleRotation.Angle=AngleRotation.Angle-2;
 }
 
 public static void RotateRight() {
  Motor.C.backward();
  Motor.A.forward();
  AngleRotation.Angle=AngleRotation.Angle+2;
 }
 
 public static void TurnLeftBackward() {
  Motor.C.backward();
  Motor.A.stop();
  AngleRotation.Angle=AngleRotation.Angle+1;
 }
 
 public static void TurnRightBackward() {
  Motor.C.stop();
  Motor.A.backward();
  AngleRotation.Angle=AngleRotation.Angle-1;
 }
 
 public static void Stop() {
  Motor.C.stop();
  Motor.A.stop();
 }
 
 public static void FinalStop() throws InterruptedException {
  Motor.A.stop();
  Motor.B.stop();
  Motor.C.stop();
  Sensor.S1.passivate();
  Sensor.S2.passivate();
  Sensor.S3.passivate();
  LCD.clear();
  TextLCD.print("oui" );
  Sound.beepSequence();
  Thread.sleep(1000);
 }
 
 public static boolean CheckPressure() {  
  return Sensor.S3.readBooleanValue();
 }
 
 public static int CheckLight1() {
  return Sensor.S1.readSensorValue(0, 100);
 }
 
 public static int CheckLight2() {
  return Sensor.S2.readSensorValue(0, 100);
 }
}

Reply

Marsh Posté le 26-01-2005 à 15:14:47    

ca a l'air d'être des fonctions de bases de l'API lejos ... pas de quoi faire un OOM à mon (humble) avis ...
 
edit : j'ai rien dit [:petrus]


Message édité par benou le 26-01-2005 à 15:15:15

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 26-01-2005 à 21:03:19    

Excellent !!!
 
Mon ex fac de Kent a collaboré à ce projet !!! J'ai tilté en me souvenant des affiches sur les bureaux des profs...
Ils ont dével cette API :  
http://www.cs.kent.ac.uk/people/staff/djb/rcx/
 
(ma prof est d'ailleurs la première personne citée dans le texte, son trip de recherche c les environnements assistés d'initiation à l'informatique...on a d'ailleurs appris le java avec une sorte d'abstraction qu'elle avait faite, qui permettait de se concentrer purement sur la logique Objet)


---------------
Jubi Photos : Flickr - 500px
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed