Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : JFrame bloqué à la fermeture d'une thread [ Archives / Au secours ] (brex)

lundi 3 mai 2004 à 16:29:53 | JFrame bloqué à la fermeture d'une thread

brex

bonjour

J'ai un soucis avec mon programme. Il est composé de 3 class: GUI, controller, tcpServer.

La class GUI est mon interface graphique (JFrame) qui comporte juste 3 boutons : démarrer, arreter et quitter.

La class controller extends de runnable et (pour l'instant) sert juste a lancer une instance de la class tcpServer.

La class tcpServer extends Thread et sert à écouté les connexions sur le réseau, elle comporte donc une boucle infini.

Le bouton démarrer lance une instance de controller, qui elle lance un thread tcpServer. Ceci fonctionne bien, la thread tcpServer ecoute bien les connexion sur le réseau. Le problème est que quand je clique sur le bouton arreter l'interface graphique se bloque et le programme plante.
Je voudrai pouvoir arreté et relancer mon controller via l'interface graphique.


=> Class Controller :

public class Controller implements Runnable{

tcpServer ecoute;

public void run(){
new Thread().start();

ecoute = new tcpServer();
ecoute.start();
System.out.println("démarrer");
}

//fonction qui arrete le thread tcpServer, executer losqu'on
//appui sur le bouton arreter dans l'interface graphique
public void arret(){
ecoute.stop();
}
}

=> class tcpServer

public class tcpServer extends Thread{

public synchronized void run(){
System.out.println("Controller lancé !!");
int port = 5555;
ServerSocket server_socket;
BufferedReader input;

try {
server_socket = new ServerSocket(port);
System.out.println("En attente de client sur le port " + server_socket.getLocalPort());

while(true) {
Socket s = server_socket.accept();
System.out.println("Nouvelle connexion accepté " + s.getInetAddress() + ":" + s.getPort());
input = new BufferedReader(new InputStreamReader(s.getInputStream()));

try {
while(true) {
String message = input.readLine();
if (message==null) break;
System.out.println(message);
}
}
catch (IOException e) {
System.out.println(e);
}

try {
s.close();
System.out.println("Connexion fermé par le client");
}
catch (IOException e) {
System.out.println(e);
}
}
}
catch (IOException e) {
System.out.println(e);
}
}
}


=> class GUI

public class GUI extends JFrame implements ActionListener{

JPanel _center;
JLabel _titre;
JButton start, stop, quit;
Controller controller;

public GUI(){
this.setTitle("Interface Graphique Server");
this.getContentPane().setLayout(new BorderLayout());

_titre = new JLabel("Interface avec le controller");
this.getContentPane().add(BorderLayout.NORTH, _titre);

_center = new JPanel();
_center.setLayout(new FlowLayout());
start = new JButton("START Controller");
start.addActionListener(this);
stop = new JButton("STOP Controller");
stop.addActionListener(this);
_center.add(start);
_center.add(stop);
this.getContentPane().add(BorderLayout.CENTER, _center);

quit = new JButton("QUIT");
quit.addActionListener(this);
this.getContentPane().add(BorderLayout.SOUTH, quit);

this.pack();
this.show();
}

public void actionPerformed(ActionEvent e) {
if(e.getSource() == start){
controller = new Controller();
controller.run();
System.out.println("Démarrage du controller");
}
if(e.getSource() == stop){
controller.arret();
System.out.println("Arrêt du controller");
}
if(e.getSource() == quit){
System.exit(0);
}
}

public static void main(String[] args){
new GUI();
}
}


Merci d'avance pour vos réponses

mardi 4 mai 2004 à 08:56:23 | Re : JFrame bloqué à la fermeture d'une thread

dmaillet

evite la fonction stop sur ton thread du controller, elle est deprecated, pas sur...
il vaut mieux mettre ton thread a null, et avant de le redemarrer, faire un new...
et puis je vois pas a quoi sert ton
new Thread().start();
dans le run de ton controller...
fais deja ca, et tu me diras si ca va mieux, on rergardera alors le reste du code...

mardi 4 mai 2004 à 08:58:03 | Re : JFrame bloqué à la fermeture d'une thread

dmaillet

autre chose, pour etre sur d'avaoir aucun pb, dans ton main fais:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new GUI();
}
});

mardi 4 mai 2004 à 10:31:27 | Re : JFrame bloqué à la fermeture d'une thread

brex

Merci pour ta réponse.

J'ai essayé ce que tu m'as di :

- J'ai modifié mon main
- J'ai commenté la ligne new Thread().start();
- j'ai mis ma thread controller = null lorsque j'appuye sur le bouton stop.

L'interface ne se bloque plus, mais le problème est que si je relance tout en appuyant sur start j'ai un message d'erreeur qui me di :

java.net.BindException: Address already in use: JVM_Bind

Si je ne me trompe pas cela veux dire que la thread tcpServer est encore affecté à mon port, donc je ne peux pas la relancer. Es-ce que tu sais comment tué cette thread quand j'appuye sur stop ? j'aimerai pouvoir faire start stop autant de fois que je veux.

Merci

mardi 4 mai 2004 à 10:42:23 | Re : JFrame bloqué à la fermeture d'une thread

dmaillet

tu mets bien ce thread a null?
et avant, il faut que tu fermes le socket je pense...

mardi 4 mai 2004 à 11:09:44 | Re : JFrame bloqué à la fermeture d'une thread

brex


C'est bon j'ai trouver, j'ai créé une fonction stopServerSocket dans ma class tcpServer qui me close server_socket. Cela me retourne l'erreur :
java.net.SocketException: socket closed
Donc ma socket est bien arrèté.

Le programme fonctionne très bien maintenant, je n'avais pas pensé a fermé la socket avant de mettre la thread à null.

Je te remercie bcp de ton aide :)


Juste pour info, est-ce que tu as déjà utilisé l'API JMF (Java Media Framework) ? ou tu connaîtrai quelqu'un qui l'as déjà utilisé?
Je t'explique, je suis chargé d'un projet qui consiste au développement d'un serveur de streaming en JAVA. J'ai étudié un peu cette API mai je n'ai pas eux de résultat très intéressant pour l'instant.
Je pense que je posterai un message sur le forum pour savoir si quelqu'un l'utilise.

Merci encore

mardi 4 mai 2004 à 11:23:33 | Re : JFrame bloqué à la fermeture d'une thread...

dmaillet

dsl, je ne connais pas cette api...
j'ai lu ce matin un message la concernant par contre,
donc tu devrais trouver des personnes pour t'aider...



Cette discussion est classé dans : system, class, out, println, controller


Répondre à ce message

Sujets en rapport avec ce message

class loadClass et class loader [ par fatalpicard ] Bonjour,J'ai un problème avec méthode loadClass, j'essaye de récupérer ma classe ImporManager depuis le classe loader (la classe se situe dans le même ajout dans un tableau en java [ par samanona ] slt, j'ai un probleme au java et j'aimerai le resoudre  voila la methode que j'ai ecrit: String tab[][]=new String[80][4];Scanner s=new Scanner(Syst Je n'arrive pas à ajouter un nombre dans un fichier RandomAccessFile [ par daviddubois ] Bonjour tout le monde,J'ai un petit problème avec un RandomAccessFile et je pense pourtant faire ce que je dois faire.Le but de mon exercice est de re No requet!!! why????? [ par iscalibar ] Bonjour, j'ai creer un program java pour envoie une requete HTTP simple vers le serveur google mais je voix que ça ne marche pas car je ne recoie aucu Socket pour un seule message??? [ par iscalibar ] slt a tt, ben j'ai ecrit un programme java qui communique avec un serveur mais il n'envoie et recevie qu'une seule requete et la deusieme requete l'en Help Me SVP [ par Big cent ] Bon voilà mon code://Classe Principalimport java.util.*;import java.io.*; public class Principale{ static Enseignant tab_ens[] = new Enseignant Impossible de saisir un entier en java , en utilisant la class console [ par lagdu ] Bonjour à tous.Je me permet de poster sur le forum affin de vous exposer mon problème.Je vais essayer d'etre le plus precis possible sur celui ci mais PB RMI Naming HELP [ par co2_gaz ] Salutj'ai passé des heures pas de solution.* dans la fonction si dessous de mon client si je supprime soit le Naming.lookup ou le Naming.rebind tout m probleme de connexion a la base donnee [ par zazou1 ] salut tous le monde ,je suis  entrain developper une application java (swing) ,pour interoger une base donnees MYsql (qui se trouve en niveau easyphp)


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 11,435 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.