Problème SWT & thread avec readLine()
Bonjour,
Je travaille sur un petit programme client/serveur pour faire du chat. Le programme client a une classe Client (dans la quelle il y a la fonction main), une classe Connexion et d'une classe Gui. L'interface est faite avec SWT. (pour info, je bosse avec Eclipse 3.2)
J'ai vu plusieurs exemples de petits programmes clients/serveur, mais je ne parviens pas à résoudre mon problème :
La classe Connexion fonctionne en tant que thread (public class Connexion extends Thread { ... } )
Voila sa fonction run() :
Code:
1 2 3 4 5 6 7 8 9 10 11
| public void run(){
this.gui.display.asyncExec(new Runnable() { //this.gui est un pointeur vers l'instance de la classe Gui dans main
public void run() {
try {
String fromServer;
while ((fromServer = in.readLine()) != null) {
gui.zoneDeTexte.insert(fromServer);
}
} catch (IOException e) { }
}});
} |
et voila la fonction main (dans la classe Client) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public static void main(String[] args) {
// GUI
gui.Gui gui = new gui.Gui();
// connection
tcp.Connexion connexion = new tcp.Connexion(gui);
gui.createSShell();
gui.sShell.open();
while (!gui.sShell.isDisposed()) {
if (!gui.display.readAndDispatch())
gui.display.sleep();
}
System.out.println("finishing...");
gui.display.dispose();
} |
dans l'interface, il y a un bouton "Se connecter" qui, lorsque on appuie dessu lance connexion.connect() qui connecte le client au serveur (ça ça marche bien) et démarre le thread en faisant this.start();
En fait, tout marche bien à une chose près : la commande in.readLine() dans la fonction run() bloque tout le reste en attendant de recevoir quelque chose du serveur. L'interface est complètement figée.
Si j'enlève :
while ((fromServer = in.readLine()) != null) { gui.zoneDeTexte.insert(fromServer);
}
tout fonctionne bien à ceci près que les messages envoyés par le serveur ne seront (par conséquent) pas affichés...
Que dois-je faire pour que la fonction in.readLine() ne fige pas l'interface ? Je pensais que le simple fait que ce soit dans un thread ferait que l'interface peut se rafraichir en parellèle, mais non :(
Comment faire ?
merci d'avance