Simulation de la synchronisation des déplacements
imdifrent
Messages postés
15
Statut
Membre
-
imdifrent Messages postés 15 Statut Membre -
imdifrent Messages postés 15 Statut Membre -
Bonjour,
S'il vous plaît, est-ce qu'il y'a quelqu'un pour m' aider sur un projet de Simulation multi-threadée de la synchronisation des déplacements de robots en java
Nous nous concentrons sur l’aspect multithreadé avec la simulation graphique des robots (avec swing), en gérant leur synchronisation pendant la circulation pour éviter la collision, l’interblocage et la famine et en utilisant les sémaphores ou moniteurs (en java).
Des information sur le projet :
Les robots circulent en ligne droite dans un seul sens horizontal ou vertical.
Chaque robot qui circule doit franchir sa ligne ou sa colonne dans un temps fini
voici la partie de code de création de l'interface et les méthodes de déplacement mais j'ais rencontrer des problème
1-comment je supprime l'icon de robot dans les dernières case (Erreur marqué dans la photo ci-jointe)
2-j'ai utilisé les sémaphore (Semaphore[10][10])pour la synchronisation alors que le problème de collision n'est pas corrigé
merci pour votre aide à l'avance
S'il vous plaît, est-ce qu'il y'a quelqu'un pour m' aider sur un projet de Simulation multi-threadée de la synchronisation des déplacements de robots en java
Nous nous concentrons sur l’aspect multithreadé avec la simulation graphique des robots (avec swing), en gérant leur synchronisation pendant la circulation pour éviter la collision, l’interblocage et la famine et en utilisant les sémaphores ou moniteurs (en java).
Des information sur le projet :
Les robots circulent en ligne droite dans un seul sens horizontal ou vertical.
Chaque robot qui circule doit franchir sa ligne ou sa colonne dans un temps fini
voici la partie de code de création de l'interface et les méthodes de déplacement mais j'ais rencontrer des problème
1-comment je supprime l'icon de robot dans les dernières case (Erreur marqué dans la photo ci-jointe)

2-j'ai utilisé les sémaphore (Semaphore[10][10])pour la synchronisation alors que le problème de collision n'est pas corrigé
merci pour votre aide à l'avance
private JFrame frmRobots;
ImageIcon robot1 = new ImageIcon("NAO_02.gif");
ImageIcon robot2 = new ImageIcon("Untitled-1_03.gif");
Semaphore s[][];
{
s = new Semaphore[10][10];
}
private ArrayList<JButton> grid = new ArrayList<JButton>();
JButton innerButton[][] = new JButton[10][10];
// autre code*********
//le rest
JButton btnStart = new JButton("START");
btnStart.setFont(new Font("Comic Sans MS", Font.BOLD, 12));
panel_1.add(btnStart);
//Demarer les thread avec un click sur le boutton
btnStart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Robot1().start();
new Robot2().start();
new Robot3().start();
new Robot4().start();
}
});
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
innerButton[i][j] = new JButton();
innerButton[i][j].setBackground(Color.white);
gridBtnPanel.add(innerButton[i][j]);
grid.add(innerButton[i][j]);
(innerButton[i][j]).setText(String.valueOf(i+","+j));
;
}
}
//initialisation des sémaphores
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++){
s[i][j]=new Semaphore(1,true);
}}
public void move1() throws InterruptedException {
int row=0;
int col=0;
while(true){
for ( col=0; col <=9; col++) {
Thread.sleep(1000);
s[row][col].acquire();
(innerButton[row][col]).setIcon(robot1);
s[row][col].release();
if(col>=1){
(innerButton[row][col-1]).setIcon(null);
}
if(col==10)
(innerButton[row][9]).setIcon(null);
}
}}
public void move2() throws InterruptedException {
int col=0;
while(true){
//(innerButton[row][9]).setIcon(null);
for ( int row=0; row <=9; row++) {
Thread.sleep(1000);
s[row][col].acquire();
(innerButton[row][col]).setIcon(robot2);
s[row][col].release();
if(row>=1){
(innerButton[row-1][col]).setIcon(null);
s[row][col].release();
}
}
}}
public void move3() throws InterruptedException {
int row=9;
int col=0;
while(true){
//(innerButton[row][9]).setIcon(null);
for ( col=9; col>= 0; col--) {
Thread.sleep(1000);
s[row][col].acquire();
(innerButton[row][col]).setIcon(robot1);
if(col<9){
(innerButton[row][col+1]).setIcon(null);
s[row][col].release();
}
}
}}
public void move4() throws InterruptedException {
int col=9;
while(true){
//(innerButton[row][9]).setIcon(null);
for ( int row=9; row>= 0; row--) {
Thread.sleep(1000);
// s[row][col].acquire();
(innerButton[row][col]).setIcon(robot1);
// s[row][col].release();
if(row<9){
(innerButton[row+1][col]).setIcon(null);
}
}
}}
public class Robot2 extends Thread{
@Override
public void run(){
try {
move2();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Robot3 extends Thread{
@Override
public void run(){
try {
move3();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Robot1 extends Thread {
@Override
public void run(){
try {
move1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Robot4 extends Thread {
@Override
public void run(){
try {
move4();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}}
1 réponse
-
Bonjour,
Je vois plusieurs problèmes, prenons par exemple move3()public void move3() throws InterruptedException { int row = 9; int col = 0; while (true) { for (col = 9; col >= 0; col--) { Thread.sleep(1000); s[row][col].acquire(); (innerButton[row][col]).setIcon(robot1); if (col < 9) { (innerButton[row][col + 1]).setIcon(null); s[row][col].release(); } } } }
Ligne 7 tu faisacquire()
mais tu ne fais lerelease()
que ligne 11, à l'intérieur du if. Or si tu ne rentres pas dans le if, il ne va jamais y avoir derelease()
...
De plus, comme ton robot ne se déplace que jusqu'à la colonne 9, forcément il va rester bloqué, il n'est pas programmé pour faire autre chose.
Attention : puisque ton robot se déplace d'une case à une autre, il faut acquérir les deux cases, celle d'où il part et celle où il arrive.
Remarque : globalement ton code est très compliqué, tu pourrais notamment te passer des multiples classes Robot1,2,3,4 et move1,2,3,4 les restructurer et ne pas avoir à dupliquer les blocs de synchronisation.
Tu pourrais par exemple faire cela avec des lambdas.
Exemple :public class Robot extends Thread { private Icon icon; private Supplier<Point> init; private Function<Point, Point> move; private Predicate<Point> finish; public Robot(Icon icon, Supplier<Point> init, Function<Point, Point> incr, Predicate<Point> finish) { this.icon = icon; this.init = init; this.move = incr; this.finish = finish; } private void acquire(Point pos) throws InterruptedException { s[pos.x][pos.y].acquire(); innerButton[pos.x][pos.y].setIcon(icon); } private void release(Point pos) throws InterruptedException { innerButton[pos.x][pos.y].setIcon(null); s[pos.x][pos.y].release(); } @Override public void run() { try { Point pos = init.get(); acquire(pos); while (!finish.test(pos)) { Thread.sleep(1000); Point nextPos = move.apply(pos); acquire(nextPos); release(pos); pos = nextPos; } release(pos); } catch (InterruptedException e) { e.printStackTrace(); } } }Robot robot1 = new Robot( icon1, () -> new Point(0, 0), // init point -> new Point(point.x, point.y + 1), // move point -> point.y == 9); // finish-
-
-
Supplier, Function, et Predicate sont des interfaces fonctionnelles prédéfinies dans Java 8. Il faudrait rajouter
import java.util.function.*;
Quant à ton NullPointerException c'est bizarre parce que j'ai testé le code de mon côté et ça fonctionnait. Tu devrais peut être rajouter un try/catch pour afficher en détail quelles sont les valeurs de pos.x et pos.y qui provoquent l'erreur mais normalement mon code ne change rien à l'initialisation des
que tu avais déjà faite.
-