Java.lang.ThreadDeath!!!!

Résolu
theCompiler Messages postés 3 Date d'inscription dimanche 1 février 2009 Statut Membre Dernière intervention 6 mai 2008 - 5 mai 2008 à 21:24
theCompiler Messages postés 3 Date d'inscription dimanche 1 février 2009 Statut Membre Dernière intervention 6 mai 2008 - 6 mai 2008 à 22:30
Salut ça va

j'espère trouver de l'aide ici car je bloque une semaine ou plus dans mon projet
comme j'ai bcp de classes, je me suis dit je vais écrire un programme qui ressemble à le mien (le même problème)
je sais que cet exemple peut être fait d'une autre méthode
Mais svp je veux que vous me corrigez ce code tel qu'il est. comme ça je pourrais corriger mon code d'origine

remarque: j'ai entendu parler de thread et de la méthode sleep mais en tant que débutant je ne sais pas si ça va me servir ici
Aidez moi!

le code est le suivant:
//Deux classes:

//la classe Main la classe de main qui va appeler la classe Affichage

class Main{
    private static int i;
    public static boolean clik;


 


    public static void main(String[] args){
        i=0;       
        Affichage aff=new Affichage(i);      
        clik=false;
        while(true){
                    if(clik==true) break;
         }//boucle pour attendre le clik


               
          while(i<5){
                     clik=false;
                    do{}while(!clik);//boucle pour attendre clik
                    i++;
                    aff.label.setText("nombres de cliques: "+i);                
                   
         }
             
       
    }
}

//la classe Affichage

class Affichage extends JFrame implements ActionListener{




    JButton bouton;     
    JLabel label;
    JPanel panneau;


    public Affichage(int i) {
        super("étapes de l'algo");
        panneau=new JPanel();
                bouton=new JButton("ok");
                bouton.addActionListener(this);
                label=new JLabel("nombres de cliques: "+i);
        panneau.add(label);
        panneau.add(bouton);  
        getContentPane().add(panneau);
        pack();
        setVisible(true);
    }


    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==bouton){
            Main.clik=true;//pour signaler un clik
        }     
    }
    }

Merci d'avance

4 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
6 mai 2008 à 10:55
Tu parles de cet algorithme : http://fr.wikipedia.org/wiki/Algorithme_du_simplexe.
Tu fais une résolution graphiquement ou avec des tableaux?

Dans tous les cas si j'ai bien compris, je te conseille une chose toute simple. Tu crées une méthode "etape" qui réalise une étape de calcul. Cette méthode sera appelée à chaque fois que tu cliques sur le bouton. Et... Et c'est tout je crois.
3
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
6 mai 2008 à 10:29
Salut,

Tu faisais quoi avant de faire du Java?

Cette boucle :
<hr size= "2" width="100%" />
while(true){
    if(clik==true) break;
}//boucle pour attendre le clik

Tu peux l'écrire comme ça :
<hr size="2" width="100%" />
while(!clik){}

Sauf que dans les deux cas, c'est très mauvais (c'est de l'attente active) en gros ça ira aussi vite que ton processeur pourra. Ca te pompes énormément de ressources. Il suffit de regarder quel part du processeur utilise le processus javaw.exe, chez moi c'est 50%. La solution vient des écouteurs (listener), tu as un actionlistener sur ton bouton, il faut t'en servir mieux que ça. Je te propose une autre version, tu peux regarder le processeur occupé, ça n'aura rien à voir.

La classe Controle. Elle ressemble à ta classe Main sauf que je préfère déporter la méthode main(String[] args) dans une classe à part.
<hr size ="2" width= "100%" />
public class Controle {

    private Presentation presentation;

    private int clickCount;

    public Controle() {
        presentation = new Presentation(this);
        clickCount = 0;
    }

    public void increment() {
        presentation.display(++clickCount);
    }

}

La classe Presentation. Elle ressemble à ta classe Affichage sauf qu'elle a un lien vers la classe Controle (qui lui est passé en paramètre dans le constructeur en rouge). Du coup, grâce à ce lien, la classe Presentation peut communique directement vers l'instance de Controle qui lui est associé en vert.
<hr size= "2" width="100%" />
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Presentation extends JFrame {

    private static final long serialVersionUID = 1L;

    private JButton button;
    private JLabel label;
    private JPanel mainPanel;

    private Controle controle;

    public Presentation(Controle controle) {
        super("Test Clic");
        setSize(200, 60);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.controle = controle;

        mainPanel = new JPanel(new FlowLayout());
        button = new JButton("OK");
        label = new JLabel();
        mainPanel.add(label);
        mainPanel.add(button);
        add(mainPanel);

        setVisible(true);
        display(0);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getControle().increment();
            }
        });

    }

    public void display(int n) {
        label.setText("Nombre de clics : " + n);
    }

    public Controle getControle() {
        return controle;
    }

}

Et enfin la classe TestClic qui instancie tout ça.
<hr size ="2" width="100%" />
public class TestClic {

    public static void main(String... args) {
        new Controle();
    }

}
0
theCompiler Messages postés 3 Date d'inscription dimanche 1 février 2009 Statut Membre Dernière intervention 6 mai 2008
6 mai 2008 à 10:48
Salut
merci pour cette solution mais moi j'aimerais avoir qqchose d'attente
car j'ai une boucle(grande boucle non celle d'attente) et je veux afficher chaque itération de la boucle. chaque itération est tout un traitement et non une simple incrémentation. Don j'ai qqchose qui tourne et je dois à chaque tour l'arrêter et prendre une photo avec la classe Affichage et dans cette classe il ya le bouton qui donne la permission de continuer à tourner et ainsi de suite
pour tout dire il s'agit de l'algorithme du simplexele chaque itération de la grande boucle est une étape de l'algorithme

Merci d'avance
0
theCompiler Messages postés 3 Date d'inscription dimanche 1 février 2009 Statut Membre Dernière intervention 6 mai 2008
6 mai 2008 à 22:30
Merci
une classe Etape j'ai jamais y pensé! ça doit être plus opérationnelle qu'une boucle "sans frein" .

il n'y a que la vérité qui dure
0
Rejoignez-nous