Release semaphore en desordre

aurelienparis12 Messages postés 2 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 16 mars 2007 - 15 mars 2007 à 20:04
aurelienparis12 Messages postés 2 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 16 mars 2007 - 16 mars 2007 à 08:42
Bonjour,
j'espere quelqu'un pourra m'aider.
Pour un projet je doit faire des deplacement des pions  et j'aimerais les faire les un apres les autres donc j'ai utilisé un semaphore .
Le soucis c'est que le release ne relache pas forcement le premier entré. J'ai pourtant mis le boolean fair à true donc la semaphore est censé respecté la logique d'une pile FIFO .

la declaration de mon semaphore
    Semaphore Sem = new Semaphore(1,true);


public void deplacerPion(final int zonedepart,final int zonearrive,final int equipe,final int type){
        
        
        
        System.out.println("Demande de "+zonedepart+" vers "+zonearrive);
        
        new Thread() {
             Zone depart=zones.getZone(zonedepart);
             Zone arrive=zones.getZone(zonearrive);
             int orix;
             int oriy;
            
            int destx;
            int desty;
            Fonctions f ;
            
            private void init(){
                System.out.println("fait de "+zonedepart+" vers "+zonearrive);
                orix=depart.getCoor(equipe, type).getX();
                oriy=depart.getCoor(equipe, type).getY();
                poserPion(zonearrive,equipe,type,0);
                destx=arrive.getCoor(equipe, type).getX();
                desty=arrive.getCoor(equipe, type).getY();
                
                temp=new Pions(new Coor(orix,oriy));
                temp.setEquipe(equipe);
                temp.setType(type);
                deplacement=true;
                f = new Fonctions(orix, destx, oriy, desty);
                retirerPion(zonedepart,equipe,type,1); 
                
            }
            
            public void run() {
                try {
                    Sem.acquire();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                init();
                //si deplacement vers la droite 
                
                if (orix < destx) {
                    for (int i = orix; i < destx; i++) {
                        temp.getPosition().setX(i);//on augmente l'abscisse de l'image du pion
                        temp.getPosition().setY(f.use(i));// on applique la fonction f à l'ordonnée de l'image
                        repaint();//temps d'arret entre chaque images
                        try {
                            
                            Thread.sleep(5);//temps d'arret entre chaque images
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
                //si deplacement vers la gauche
                if (orix > destx) {
                    for (int i = orix; destx < i; i--) {
                        temp.getPosition().setX(i);//on diminue l'abscisse d'affichage de l'image
                        temp.getPosition().setY(f.use(i));// on applique la fonction f à l'ordonnée de l'image
                        repaint();// on rafrachit l'image
                        try {
                            Thread.sleep(5);//temps d'arret entre chaque images
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
                temp.getPosition().setX(destx);//on place le pion à sa destination 
                temp.getPosition().setY(desty);
                repaint();
                deplacement=false;
                poserPion(zonearrive,equipe,type,1);
                Sem.release();
            }
            
        }.start();// on lance le deplacement du pion
        
        
    }


en executant :
deplacerPion(4,1,1,3);
deplacerPion(1,3,1,3);
deplacerPion(3,2,1,3);
deplacerPion(2,4,1,3);


j'obtiens :

Demande de 4 vers 1
Demande de 1 vers 3
Demande de 3 vers 2
fait de 4 vers 1
Demande de 2 vers 4
fait de 3 vers 2
Exception in thread "Thread-4" java.lang.NullPointerException
    at test.Plateau_jeu$1.init(Plateau_jeu.java:346)
    at test.Plateau_jeu$1.run(Plateau_jeu.java:369)

ce qui est normal puisqu'il deplace le pions de la case 4 à 1 puis apres essaye de deplacer le pion de la case 3 vers 2 mais il n'y a pas de pions sur la case 3 donc ne trouve pas le pion à deplacer :cry:

Merci d'avance à tout ce qui auront tout lu meme s'il ne reponde pas au moins vous avez essayé .

2 réponses

davidauche Messages postés 150 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 8 janvier 2008
16 mars 2007 à 02:17
c'est nécessaire d'utiliser un thread pour ce genre des choses?
aurelienparis12 Messages postés 2 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 16 mars 2007
16 mars 2007 à 08:42
oui a cause de l'edt car on doit voir le pion se deplacer . Sans thread le pion apparaitrait directement à sa place final . De plus le thread.sleep bloquerai mon interface trop souvent .
Rejoignez-nous