Thread afficheur port serie

kourdou59 Messages postés 56 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 5 septembre 2005 - 18 août 2005 à 16:17
kourdou59 Messages postés 56 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 5 septembre 2005 - 19 août 2005 à 14:34
Yo !
Je dois faire une appli qui lit des codes barres. Donc j'ai un lecteur code barre branché sur le port série. Quand je flashe un code, j'insère le code dans une JTable et je dois envoyer un message sur un afficheur à cristaux liquides branché avec le lecteur code barre.
Bref, tout ceci fonctionne grâce à un thread sur le port série... Le problème c'est qu'au bout de quelques ouvertures de fenêtres dans la barre de menu, l'affichage est ralenti. Si je flashe un code barre, ça reprend un rythme normal.
J'ai viré ma procédure d'envoi de message sur l'afficheur et tout a l'air de fonctionner correctement.
En fait, je voudrais savoir comment m'y prendre pour que l'envoi de message à l'afficheur ne perturbe pas mon appli... Un 2e thread peut être ? Oui mais comment,... j'ai jamais rien compris aux Threads...

Si quelqu'un a une idée... Merci à tous !

10 réponses

dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
19 août 2005 à 08:54
Regarde avec un profiler pourquoi ca ralenti, si c'est bien ce que tu
penses, alors oui, un 2 eme thread sera approprie ( de toute facon, un
deuxieme thread serait le bienvenue, que tu pourrais synchroniser afin
de notifier un nouveau scan. Fouille un peu sur Google, tu trouveras
plein d'exemple de thread... ou bien ici aussi...)
0
kourdou59 Messages postés 56 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 5 septembre 2005
19 août 2005 à 10:17
Merci. C'est ce que j'avais fait et que je viens de refaire. Mais les threads et processus, c'est carrement trop flou pr moi.


J'ai dû mal à voir comment mettre un 2e Thread dans ma classe qui hérite Thread. Pour illuster...

public class LectureCodeBarre extends Thread implements SerialPortEventListener {
private InputStream fluxLecture;
private OutputStream fluxEcriture;
// ...

public void demandeDonnees(){
// ....
envoiMessageAfficheur("message");
}

public void serialEvent(SerialPortEvent event){
// ....
demandeDonnees();
}

private void envoiMessageAfficheur (String message){ ... }

public void run(){
while(true){
try{ Thread.sleep(2000); } catch(InterruptedException e) { }
}
}
}


public class MonAppli {
public static void main(String [] args){
LectureCodeBarre lcb=new LectureCodeBarre();
lcb.start();
}
}
Voilà si quelqu'un a une idée pour claquer un 2e Thread...
0
dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
19 août 2005 à 10:37
private void envoiMessageAfficheur (String message){

new SwingWorker(){

public Object construct(){

//ici tu renvoie le message

return null;

}

}.start();

}
0
kourdou59 Messages postés 56 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 5 septembre 2005
19 août 2005 à 11:43
Désolé mais j'ai pas dû tout piger. Mon code qui envoie le message à l'afficheur, je le met où ? Je peux pas le mettre dans construct() car sinon je peux pas accéder à la variable globale fluxEcriture. Et c'est là que ça ralentit, quand je fais fluxEcriture.write(...);

Désolé, si je suis un boulet...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
19 août 2005 à 11:56
si dans le construct du swingworker, tu peux acceder au variable de ta classe
0
kourdou59 Messages postés 56 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 5 septembre 2005
19 août 2005 à 12:56
Autant pour moi, lol, il prend les variables de la classe (j'avais claqué un this devant dc normal). Par contre, pour le paramètre "message", là ça passait pas, il me mettait comm erreur : "local variable message is accessed from within inner clas; needs to be declared final." donc je l'ai mis en variable de classe que je réinitialise à l'entrée de envoiMessageAfficheur.

Donc maintenant, tout compile. Par contre à l'exécution, j'ai eu un message sur IllegalThreadStateException... Donc j'ai encadré le start() du SwingWorker par un try ... catch(IllegalThreadStateException). Pareil pour le start de LectureCodeBarre. Et en fait,à l'exécution, il va toujours dans le catch et le message de l'erreur est "null"
0
dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
19 août 2005 à 13:39
nan, deja, tu peux mieux faire en faisant un final dans la methode:

private void envoiMessageAfficheur (final String message){
a quel moment tu as un illegal thread state exception?
0
kourdou59 Messages postés 56 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 5 septembre 2005
19 août 2005 à 13:49
Ok merci pour le final. J'ai viré mes try... catch (IllegalThreadStateException e)...
A l'execution de l'appli, j'ai le message suivant :

java.lang.IllegalThreadStateException
at java.lang.Thread.start(Native Method)
// ....

et rien dans ma fenêtre graphique.
Donc j'avais claqué le try catch au start de LectureCodeBarre et au start dans envoiMessageAfficheur pour que l'appli s'exécute mais ça passe tjs par le catch
0
dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
19 août 2005 à 14:10
oui, mais quel est la ligne d'erreur???
0
kourdou59 Messages postés 56 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 5 septembre 2005
19 août 2005 à 14:34
La ligne d'erreur est lcb.start(); (cf. tt en haut).
0
Rejoignez-nous