Problème de thread

cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004 - 15 juin 2004 à 16:06
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004 - 15 juin 2004 à 19:31
Salut,
Voici ce que j'ai fait, en faite je veux pouvoir faire des fenetres indépendantes les unes des autres, le pb c que pour ouvrir et fermer un thread c facile, mais si je veux quitter complement le systeme ensuite (fermer le programme si tous les threads sont fermer) j'arrive pas !
Voici mon code :

public class Bloc_note
{
public static void main(String[] args)
{new Fenetre().start();}
}

//c'était ma classe principale
//voici celle qui gère les threads, a savoir que pour ouvrir un nouveau thread je fais pareil qu'en haut

public class Fenetre extends Thread
{
public static int Identifiant_fenetre = -1;
public final int Identifiant_fenetre_fermee = 0;
private static boolean Fin;
private static boolean Fenetres_courantes[] = {false, false, false, false, false};

public Fenetre()
{
Identifiant_fenetre++;
Fenetres_courantes[Identifiant_fenetre] = true;
}

public void run()
{
new Fenetre_reelle(Identifiant_fenetre);
Fin = false;
while (!Fin)
{
try
{sleep(20);}
catch (InterruptedException Erreur)
{}
}
}

public static void Ferme(int Identifiant_fenetre_fermee)
{
boolean Ok = true;
for (int Fenetre_courante = 0; Fenetre_courante < Fenetres_courantes.length; Fenetre_courante++)
{
if (Fenetres_courantes[Fenetre_courante] == true)
{Ok = false;}
}
if (Ok == true)
{System.exit(0);}
Fin = true;
}
}

//un bout de code d'une autre classe

public Fenetre_reelle(final int Identifiant_fenetre)
{
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent Evenement)
{Fenetre.Ferme(Identifiant_fenetre);}
});

Merci beaucoup à tous ceux qui m'aideront...

9 réponses

kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 9
15 juin 2004 à 16:40
je comprends pas bien ton code. Elle est sensée faire quoi la méthode ferme() de Fenetre ?
0
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004
15 juin 2004 à 16:42
fermer le thread, et si tous les threads sont fermes, system.exit
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 9
15 juin 2004 à 17:13
je comprends pas ce que tu veux faire. Quand tous les threads sont terminés, l'application s'arrête automatiquement
0
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004
15 juin 2004 à 17:16
pas chez moi alors ! quand je lance le programme, je lance plusieurs threads, ensuite je les ferme, le programme est toujours en cours d'execution... alors que si je fais un system.exit(0); le programme s'arrete (sinon je dois le fermer avec crtl alt suppr).
Sinon l'ouverture / fermeture de thread marche je pense.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 9
15 juin 2004 à 17:27
voici un petit test (j'ouvre 4 JFrames chacune dans son thread qui contiennent un JTextArea). Les 4 frames sont indépendantes et quand je les ferme toutes l'appli s'arrête.

public class Fenetre extends JFrame implements Runnable {

    public static void main(String[] args) {
        System.out.println("lancement des threads");
        new Thread(new Fenetre()).start();
        new Thread(new Fenetre()).start();
        new Thread(new Fenetre()).start();
        new Thread(new Fenetre()).start();
        System.out.println("lancement terminé");
    }

    public Fenetre() {
        super();
        getContentPane().add(new JTextArea(2, 13));
        pack();
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent Evenement) {
                System.out.println("c'est la fin. fermeture de la fenêtre");
            }
        });
    }

    public void run() {
        setVisible(true);
    }
}


Sinon mettre des variables static quand on fait du multithreading c'est très dangereux (partage de données aléatoire). De plus quand des données sont partagées, il faut protéger les accés par des synchronized du style :
public synchronized void setFin(boolean fin){
this.fin=fin;//le boolean fin ne doit pas être static !!!
}
public synchronized boolean getFin(){
return fin;
}
0
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004
15 juin 2004 à 17:59
les variables que je faisais passer ct pour avoir un id à chaque thread pour le fermer. voilà ce que j'ai fait en suivant ton exemple qui me simplifie les choses :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Fenetre extends JFrame implements Runnable
{
private Toolkit Kit;
private Dimension Taille_ecran;
private int Hauteur;
private int Largeur;
private Image Icone;

public Fenetre()
{
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

setTitle("[ Bloc note ] : Aucun fichier chargé");

Kit = Toolkit.getDefaultToolkit();
Taille_ecran = Kit.getScreenSize();
Hauteur = Taille_ecran.height;
Largeur = Taille_ecran.width;

setSize(Largeur / 2, Hauteur / 2);
setLocation(Largeur / 4, Hauteur / 4);

Icone = Kit.getImage("Icone.gif");
setIconImage(Icone);

Zone_texte Lieu_ecriture = new Zone_texte(this);
JTextArea Texte_composant = Lieu_ecriture.Donne_JTextArea();
new Actions(this, Texte_composant);
new Menus(this, Texte_composant);
}

public void run()
{show();}
}

et

public class Bloc_note
{
public static void main(String[] args)
{new Fenetre().start();}
}
0
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004
15 juin 2004 à 18:06
g oublie de preciser que ca marche pas :o

g ca :

java.lang.NoSuchMethodError: Fenetre.start()V
at Bloc_note.main(Bloc_note.java:4)
Exception in thread "main"

Merci bcp de consacrer de ton temps pour un debutant comme moi.
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 9
15 juin 2004 à 18:59
ce n'est pas un thread vu que ça hérite de JFrame. Pour le lancer il faut faire
new Thread(new Fenetre()).start();
0
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004
15 juin 2004 à 19:31
merci bcp ca marche nickel ;)
merci encore pour tout le temps passé sur mon pb
0