Problème de thread

Signaler
Messages postés
43
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
11 décembre 2004
-
Messages postés
43
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
11 décembre 2004
-
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

Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
8
je comprends pas bien ton code. Elle est sensée faire quoi la méthode ferme() de Fenetre ?
Messages postés
43
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
11 décembre 2004

fermer le thread, et si tous les threads sont fermes, system.exit
Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
8
je comprends pas ce que tu veux faire. Quand tous les threads sont terminés, l'application s'arrête automatiquement
Messages postés
43
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
11 décembre 2004

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.
Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
8
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;
}
Messages postés
43
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
11 décembre 2004

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();}
}
Messages postés
43
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
11 décembre 2004

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.
Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
8
ce n'est pas un thread vu que ça hérite de JFrame. Pour le lancer il faut faire
new Thread(new Fenetre()).start();
Messages postés
43
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
11 décembre 2004

merci bcp ca marche nickel ;)
merci encore pour tout le temps passé sur mon pb