Simulation de la synchronisation des déplacements
imdifrent
Messages postés
12
Date d'inscription
Statut
Membre
Dernière intervention
-
imdifrent Messages postés 12 Date d'inscription Statut Membre Dernière intervention -
imdifrent Messages postés 12 Date d'inscription Statut Membre Dernière intervention -
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();
}
}}}
A voir également:
- Simulation de la synchronisation des déplacements
- Déplacer la barre des taches windows 11 - Guide
- Mes deplacements - Guide
- Vous ne pouvez pas déplacer des objets en dehors de la feuille ✓ - Forum Excel
- Dans la présentation à télécharger, déplacez l'image dans le cadre sans en modifier la taille. redressez l'image pour que le niveau de la mer soit à l'horizontale. faites correspondre : la ligne avec le niveau de la mer ; le point avec le sommet de la grande voile. combien d'oiseaux sont dans le cadre ? - Forum Word
- Impossible de synchroniser manette wii ✓ - Forum Wii
1 réponse
Bonjour,
Je vois plusieurs problèmes, prenons par exemple move3()
Ligne 7 tu fais
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 :
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 fais
acquire()mais tu ne fais le
release()que ligne 11, à l'intérieur du if. Or si tu ne rentres pas dans le if, il ne va jamais y avoir de
release()...
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
Merci beaucoup pour votre réponse c'est très intéressante je suis entraîne d'applique ce que vous dite et Je vais annoncer tous les détails.
En ce qui concerne votre code c'est quoi
Après exécution de code la fenêtre s'affiche mais y'a rien voila les erreur dans la console Exception in thread "Thread-2" java.lang.NullPointerException
at Robot_1.acquire(Robot_1.java:27)
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 de que tu avais déjà faite.
En ce qui concerne mon code le problème de suppression d'icon de robot dans les dernières case est résolue mais le problème de collision n'est pas encore résolue