SWT et thread

Résolu
chevalvenus Messages postés 3 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 6 mars 2006 - 28 févr. 2006 à 11:40
chevalvenus Messages postés 3 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 6 mars 2006 - 6 mars 2006 à 13:49
Salut,
voilà je séche sur l'utilisation des SWT et des threads, je ne sais pas si c'est le bon théme pour poster ça mais bon!!!

Je désirerais créer une appli contenant un CLabel d'un côté et une classe avec un Thread de l'autre côté qui aurait la possiblité de modifier le CLabel.

Voici mon code:
Classe MaintTest
import org.eclipse.swt.widgets.Display;

public class MainTest {
public static Display display;
public static void main(String[] args) {

display = new Display();

Appl appli = new Appl();

LaSocket th1 = new LaSocket(appli);
th1.start();

appli.fenetre();
}
}

Classe Appl

import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.widgets.*;

public class Appl {
public Shell shell;

public CLabel label;

public synchronized void message(String mess) {
this.label.setText(mess);
}

public void fenetre() {

shell = new Shell(MainTest.display);

label = new CLabel(shell, SWT.BORDER);
message("LE LABEL INITIAL");
label.setSize(110, 20);
label.setLocation(30, 30);

shell.setSize(200, 200);
shell.setText("Bandeau Multimédia");
shell.open();
while (!shell.isDisposed()) {
if (!MainTest.display.readAndDispatch())
MainTest.display.sleep();
}
MainTest.display.dispose();
}
}

Classe LaSocket
public class LaSocket extends /*Appl implements Runnable*/Thread {


Appl appli;
public LaSocket(Appl application) {
appli =application;
}
public void run() {
try {
System.out.println("Avant le Spleep");
Thread.sleep(5500);
System.out.println(appli.label.getText());
appli.message("Le label modifié par le thread");

System.out.println("Après le sleep");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Comme vous pouvez le voir il s'agit d'un code tout ce qu'il y a de plus basique.

J'ai vu qu'il fallait que je rajoute une ligne tel que:
parent.getDisplay().syncExec(new Runnable(){});

Or je ne sais pas où, ni comment la rajouter!!!

Voilà si quelqu'un à une solution, ou peut me dire où et comment implémenter cette ligne, merci d'avance!!!
CHeval

2 réponses

kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
1 mars 2006 à 12:43
Salut,

il faut mettre cette instruction dans la méthode message :
public void message(..){
parent.getDisplay().asyncExec(new Runnable(){

public void run(){

this.label.setText(mess);
}
});
}

Ceci permet de mettre à jour le texte du label à la prochaine occasion.
3
chevalvenus Messages postés 3 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 6 mars 2006
6 mars 2006 à 13:49
C'est effectivement la solution.
Merci à toi, mais j'en ai développer une autre qui fonctionne également.
J'ai en effet, remarqué qu'en SWT, il existait une méthode propre au display qui se nomme WAKE(). Qui permet de le faire sortir de sa boucle, il ne reste alors qu'a lancer une méthode tel que la méthode message, et le texte est alors mis à jour.

Par contre je ne sais pas, dès deux solution, laquelle est la meilleure, et je suis preneur des différents points de vue de chacun!!

Merci beaucoup quand même!!!!
0
Rejoignez-nous