IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDT/SwingWorker Java Discussion :

[Freeze Swing et Threads] Freeze lors d'un appel


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Par défaut [Freeze Swing et Threads] Freeze lors d'un appel
    Bonjour,

    voici mon problème,

    J'ai une architecture de type mvc dont le controller appelle la vue et le modèle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    package PFIL.MainPackage;
     
    import java.awt.event.*;
    import java.util.Observable;
    import PFIL.CarnetAdresses.*;
    import PFIL.PartageClient.*;
    import PFIL.PartageServeur.*;
    import PFIL.Preferences.*;
    import javax.swing.*;
     
    /**
     *
     * @author Benats Guillaume
     *         Roland Charles
     **/
     
    public class MainController{
    //OVERVIEW: Interfacage entre la vue et le modèle d'accueil du programme
     
        MainView view;
        MainModel model;
     
        public MainController(){
            view = new MainView();
            view.activateFrame(adressBookListener, clientListener, serverListener, prefListener);
            model = new MainModel();
            model.addObserver(view);
        }
     
        ActionListener prefListener = new ActionListener(){
     
            public void actionPerformed(ActionEvent e){
     
            }
        };
     
        ActionListener clientListener = new ActionListener(){
     
            public void actionPerformed(ActionEvent e){
                ConnectToServController client = new ConnectToServController();
            }
        };
     
        ActionListener serverListener = new ActionListener(){
     
            public void actionPerformed(ActionEvent e){
     
                try{
                    TCPServer serv = new TCPServer();
                    serv.launch();
                }catch(Exception err){
                    err.printStackTrace();
                }
            }
        };
     
        ActionListener adressBookListener = new ActionListener(){
     
            public void actionPerformed(ActionEvent e){
     
                CarnetAdresseController adressBook = new CarnetAdresseController();
            }
        };
     
        public static void main(String[] args){
        //REQUIRES: /
        //MODIFIES: /
        //EFFECTS: Lance le programme 
     
            MainController pfil = new MainController();
        }
     
    }
    la partie qui m'intéresse est celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        ActionListener clientListener = new ActionListener(){
     
            public void actionPerformed(ActionEvent e){
                ConnectToServController client = new ConnectToServController();
            }
        };
    ce listener instancie une classe qui est en fait un serveur TCP basique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    package PFIL.PartageServeur;
     
    import java.io.*;
    import java.net.*;
     
    /**
     *
     * @authors Benats Guillaume
     *          Roland Charles
     **/
     
    public class TCPServer implements Runnable{
    //OVERVIEW: Gestion du serveur de partage
     
        ServerSocket srv;
     
        BufferedReader clientInput;
        OutputStream clientOutput;
     
        public TCPServer(){
     
             try{
                srv = new ServerSocket(1234);
             }catch(IOException e){
                 e.printStackTrace();
             }
        }
     
        public TCPServer(Socket client) throws Exception {
            clientInput = new BufferedReader(new InputStreamReader(client.getInputStream()));
            clientOutput = client.getOutputStream();
        }
     
        public void run() {
            try{
                int level = 3;
                String line = clientInput.readLine();
                if(line != null){
                    level = Integer.parseInt(line);
                }
                if((line = clientInput.readLine()) != null){
                    File f = new File("."+File.separator+"xml");
                    System.out.print("Client request for file " + line + "...");
                    if(f.exists()) {
                        copyStream(new FileInputStream(f), clientOutput, true);
                        System.out.println(" transfer done.");
                    }else if(level > 0){
                        System.out.println(" file is not here, lookup further...");
                        boolean found = lookupFurther(level-1, line, clientOutput);
                        System.out.println(found ? "Transfer done." : "File not found.");
                    }
                }
                clientInput.close();
                clientOutput.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
     
        static boolean lookupFurther(int level, String fname, OutputStream out) throws IOException{
     
            BufferedReader hosts;
            try{
                hosts = new BufferedReader(new FileReader("servers.list"));
            }catch(FileNotFoundException e) {
                System.out.println("No servers.list file, can't lookup further !");
                return false;
            }
     
            String ip;
            boolean found = false;
            while(! found && (ip = hosts.readLine()) != null){
                System.out.println("trying server " + ip);
                try{
                    Socket s = new Socket(ip, 1234);
                    PrintWriter srv = new PrintWriter(s.getOutputStream(), true);
                    srv.println(level + "\n" + fname);
                    int nbytes = copyStream(s.getInputStream(), out, true);
                    s.close();
                    found = (nbytes > 0);
                }catch(ConnectException e){
                    e.printStackTrace();
                }
            }
            hosts.close();
     
            return found;
        }
     
        public static int copyStream(InputStream in, OutputStream out, boolean close) throws IOException{
            int nbytes = 0, total = 0;
            byte[] buf = new byte[1024];
            while ((nbytes = in.read(buf)) > 0) {
                out.write(buf, 0, nbytes);
                total += nbytes;
            }
            if(close){
                in.close();
            }
            return total;
        }      
     
        public void launch(){
            while(true) {
                try{
                    Thread t = new Thread(new TCPServer(srv.accept()));
                    t.start();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

    Pourtant malgré que le TCPServer soit exécuté dans un thread séparé, quand je clique sur le bouton swing activant mon listener qui lui-meme instancie le TCPServer, Swing se freeze et attends la fin du TCPServer (ce qui n'arrive pas évidemment, vu la boucle infinie) donc je suis un peu perdu...

    Comment se fait-il que swing freeze alors que je lance un nouveau thread?

    sans swing, tout marche nickel...



    un grand merci

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    J'ai peux etre lu le code trop vite, mais il me semble que ta méthode launch déclenche (dans le Thread de l'UI au passage :-)) une boucle infinie qui crée un Thread systématiquement, d'où le freeze.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Freeze appli multi-thread
    Par convexe dans le forum C#
    Réponses: 1
    Dernier message: 10/03/2010, 14h33
  2. Jonas freezé, tous les threads sont occupés
    Par Bouhaouala dans le forum JOnAS
    Réponses: 1
    Dernier message: 07/11/2009, 23h36
  3. Thread, freeze GUI et priorités
    Par Niak74 dans le forum Qt
    Réponses: 9
    Dernier message: 24/09/2009, 11h34
  4. Warning listener swing matisse + freeze swing matisse
    Par laurentapologic dans le forum NetBeans
    Réponses: 1
    Dernier message: 30/12/2008, 17h41
  5. Réponses: 11
    Dernier message: 24/11/2006, 22h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo