Simulation de la synchronisation des déplacements
Fermé
imdifrent
Messages postés
12
Date d'inscription
dimanche 3 mai 2015
Statut
Membre
Dernière intervention
25 avril 2017
-
25 déc. 2016 à 14:51
imdifrent Messages postés 12 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 25 avril 2017 - 26 déc. 2016 à 18:38
imdifrent Messages postés 12 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 25 avril 2017 - 26 déc. 2016 à 18:38
A voir également:
- Simulation de la synchronisation des déplacements
- Mes déplacements google - Guide
- Déplacer la barre des taches windows 11 - Guide
- Affichez l'ensemble des diapositives à l'écran avec 5 diapositives par ligne. repérez le groupe de 3 diapositives avec une fleur identique alignées verticalement, supprimez la première d'entre elles. un nouveau groupe de 3 diapositives avec une fleur identique alignées verticalement apparaît, supprimez encore la première d'entre elles. déplacez les 3 premières diapositives de la 4e ligne au début de la présentation. quel mot est formé par les lettres de la première colonne ? - Forum Powerpoint
- Simulation place accor hotel arena - Forum Loisirs / Divertissements
- Logiciel simulation ombre solaire - Télécharger - Architecture & Déco
1 réponse
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
25 déc. 2016 à 22:59
25 déc. 2016 à 22:59
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
Modifié par imdifrent le 26/12/2016 à 13:21
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
26 déc. 2016 à 15:28
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)
26 déc. 2016 à 18:23
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.
26 déc. 2016 à 18:38
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