Problème d'utilisation des Threads avec lib javacomm - Java - Programmation
Marsh Posté le 16-06-2008 à 21:06:48
effectivement le sleep est rarement la bonne solution.
Si je comprend bien tu es client: Tu envoie un message, et tu reçoit une réponse ?(c'est une question en fait)
Généralement dans les communication:
La communication entre threads se fait dans des queue fifo (Une queue par thread).
Dans la queue, on peut mettre:
Voici un exemple de "queue" pour une communication entre thread (tu remarquera quelle est "thread safe" )
Code :
|
Marsh Posté le 17-06-2008 à 09:35:15
Oui j'envois un message et je reçois une réponse. Le problème là, c'est que avec les sleeps c'est trop aléatoire, en plus selon le nombre de requêtes que j'ai a effectuer il faudrait que le sleep soit de longueur différente, donc c'est pas trop gérable proprement.
Avec les join() aussi ça ne marche pas.
En gros voici le topo:
1 Thread emetteur
1 Thread recepteur
Le programme principal.
L'idée ici c'est que l'emetteur, qui envoit les requêtes à l'appareil, va creer autant de thread qu'il y a de requêtes:
public void run() {
Ecouteur thread2 = new Ecouteur(idIns, pouet(), idMethode, chemin_Portserie, pContext,connex);
//Ce thread sert juste pour l'initialisation
Initi thread3 = new Initi(retBuff(), idMethode, chemin_Portserie, pContext,connex);
try {
//On lance l'init
thread3.start();
communique("B" );
sleep(3000);
communique("B" );
//Et tant que l'init est pas finie on reste dedans grace au join()
thread3.join();
for (int i = 201 ; i <= 210 ; i++ ) {
communique("A" + i );
new Thread(thread2).start();
thread2.join();
}
thread2.start();
communique("A210" );
thread2.join();
communique("Z" );
close();
} catch (InterruptedException e) {
}
}
Genre là dans la boucle, l'idée est de récuperer plusieurs fois AXXX, XXX correspond à un numéro, et l'appareil doit renvoyer des résultats. Le problème c'est que la machine est connectée en 1200 bauds et que il faut lui laisser le temps de répondre. Avec les join() même problème, des fois ça insère parfaitement les 10 résultats au final, mais en bidouillant avec des sleeps et autres... Impossible de faire ça proprement et de façon sûre (qui marche à chaque fois).
Marsh Posté le 16-06-2008 à 09:32:18
Bonjour,
alors voilà j'espère que quelqu'un pourra m'aider avec ça, je dois développer en ce moment un petit programme permettant d'établir la communication entre le PC et une machine reliée sur le port série.
Pour cela j'utilise la librairie javacomm de sun, et les thread, le problème étant que je dois récupérer des données sur l'appareil relié, donc il faut que pendant un certain temps, le PC envoit les chaines correspondant à l'initialisation, puise attende un certain temps, puis envois ses différentes requêtes, attende un certain temps, puis envois la chaine correspondant au retour en idle mode de l'appareil.
Le truc c'est que j'ai réussi à gérer la connexion, une requête, la déconnexion, mais à partir du moment ou j'execute plus de chose ça devient tendu, car je joue avec des sleeps pour faire ça, et si j'ai plus ou moins de requêtes, la durée des sleep doit être proportionnelle... bref avec les sleeps c'est pas jouable, que j'utilise la méthode événementielle de javacomm ou en utilisant les flux.
Apparement une technique serait de créer un nouveau thread à chaque fois... quelqu'un aurait déjà fait ça?
Sinon j'avais pensé mettre le premier thread en pause, par exemple celui qui envoit la requête, et le faire reprendre quand l'autre à finit le traitement, mais c'est Deprecated dans l'API Java.
J'espère être clair, et que quelqu'un ai déjà fait un truc du genre.
Merci