0 votes

Application de chat, comment éviter de gâcher la sortie

J'ai l'application Chat typique.

Le côté client est mis en œuvre en utilisant deux Threads.

Thread1

do {

 show menu
 read option
 case option
  1: option1
  2: option2
  .
  .
  . 
  5:end
     end case
while (!end)

Le fil 2 :

do {

 read message from socket
 display message
while (!end)

Un problème est que le Thread1 est trop rapide, donc après avoir traité l'option, il affiche le menu à nouveau avant que le Thread2 puisse afficher son message. J'ai résolu ce problème en mettant le Thread1 en sommeil pendant 1000ms, mais je ne sais pas s'il y a une meilleure façon de le faire.

L'autre est la suivante : lorsqu'un client ne fait rien, il y a juste un message à l'écran demandant une option à traiter. Si un autre client lui envoie un message, alors ce message s'affiche après la promesse, donc l'information est désordonnée : voici un exemple de ce qu'un client verra après avoir reçu un message d'un autre client.

1.- Print users conected  
2.- Send message to all  
3.- Send message to a user  
4.- Quit  
Choose an option: Message received from user "david": hello!  

Y a-t-il un moyen de régler ce problème ?

1voto

Eric Points 8793

Votre premier problème peut être résolu avec la synchronisation des threads. C'est un sujet lourd, mais les threads le sont en général, alors préparez-vous à un certain apprentissage.

Sujet 1
attendre que l'utilisateur fasse un choix
l'utilisateur fait un choix
process -> notifie le traitement du fil 2
attendre que le fil 2 soit ok
attendre que l'utilisateur fasse un choix

Sujet 2
attendre le traitement du fil 1
envoie des données via un socket
notifie au thread 1 que c'est bon
attendre le traitement du fil 1

votre deuxième problème peut être résolu avec le gui. Il n'y a pas beaucoup de programmes de chat basés sur la console et il y a une raison à cela. Les systèmes unix ont des ncurses pour gérer le positionnement du texte dans la console mais Windows n'a que des hacks équivalents aux ncurses. Vous pourriez vouloir le vérifier

0voto

Jamer Points 198

Si vos threads communiquent avec un tuyau, vous pouvez faire en sorte que le premier thread attende que le second dise "J'ai terminé".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X